文档章节

PHP匿名函数、闭包、function use

自我修炼
 自我修炼
发布于 2017/02/09 21:00
字数 654
阅读 3
收藏 0
点赞 0
评论 0

匿名函数,也叫闭包函数(closures) ,允许临时创建一个没有制定名称的函数。最常用作回调函数(callback)参数的值。

匿名函数实例:

<?php
    /** * preg_replace_callback 执行一个正则表达式所搜并且使用一个回调进行替换。 * strtoupper 将字符串转化为大写 */
    echo preg_replace_callback('~-([a-z])~', function ($match){
        //$match[1] = 'w'
        return strtoupper($match[1]);
    },'hello-world');

//输出 helloWorld

闭包函数也可以作为变量的值来使用。PHP将会自动把此种表达式转换成内置类 Closure 的对象实例。把一个 Closure 对象赋值给一个变量的方式与普通变量赋值的语法一样,最后也要加上分号。

匿名函数变量赋值实例:

<?php

    $printString = function($arg){
        echo $arg;
    };

    $printString('hello world');
    //输出 hello world

闭包函数继承父作用域中的变量。任何此类变量都应该用 use 语言结构传递进去。

从父作用域继承变量:

<?php
    //定义变量
    $message = 'hello world';
    //匿名函数变量赋值
    $example = function(){
        var_dump($message);
    };
    //执行后输出 Notice: Undefined variable
    $example();

在未使用关键字use 时,PHP不能在匿名函数中调用所在代码上下文变量。

<?php
    //定义变量
    $message = 'hello';
    //匿名函数继承父作用域的变量($message)
    $example = function() use ($message){
        var_dump($message);
    };
    //输出 string 'hello' (length=5)
    echo $example();
    //同样输出 string 'hello' (length=5)
    $message = 'world';
    echo $example();

使用关键字use时,PHP可以在调用匿名函数中调用所在代码上下文的变量,但为什么第二次调用没有发生变化哪?
是因为匿名函数可以保存所在代码块上下文的一些变量和值(即:闭包函数将会保存第一次继承的父作用域的变量和值),值传递只是传递继承父作用域中变量和值的一个副本。

要想改变父作用域的值并体现在匿名函数调用中,该怎么办哪?
我们要用引用传递(即:在变量前面添加&),如下所示:

<?php
    //定义变量
    $message = 'hello';
    //匿名函数继承父作用域的变量($message)
    $example = function() use (&$message){
        var_dump($message);
    };
    //输出 string 'hello' (length=5)
    echo $example();
    //输出 string 'world' (length=5)
    $message = 'world';
    echo $example();

用引用传递(即:在变量前面添加&)实际上是操作的同一内存,而不是一个副本。

同样闭包函数也可以接受常规参数的传递,如下所示:

<?php
    //定义变量
    $message = 'hello';
    //匿名函数继承父作用域的变量($message)
    $example = function($arg) use ($message){
        var_dump($message . ' ' . $arg);
    };
    //输出 string 'hello world' (length=11)
    echo $example('world');

© 著作权归作者所有

共有 人打赏支持
自我修炼
粉丝 0
博文 9
码字总数 11400
作品 0
昆明
项目经理
PHP匿名函数及闭包

匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数,C++的新标准C...

新新 ⋅ 2015/09/16 ⋅ 0

PHP闭包(Closure)初探

不知不觉发现PHP已经出到了5.5版本,而自己一直在用PHP5.2,让我看起来像深山出来的小伙子一样,又土又落后。在我习惯在javascript中使用闭包之后,忽然间对PHP的闭包打起了兴趣。 于是乎在网...

豆浆Melon ⋅ 2013/04/30 ⋅ 17

PHP闭包函数的使用

PHP闭包函数的使用 匿名函数也叫闭包函数(closures允许创建一个没有指定没成的函数,最经常用作回调函数参数的值。 闭包函数没有函数名称,直接在function()传入变量即可使用时将定义的变量...

eatnothing ⋅ 2016/02/13 ⋅ 0

PHP常用函数篇

PHP常用函数篇 1.为什么要使用函数? 除了内建的PHP函数,我们可以创建我们自己的函数。 函数是可以在程序中重复使用的语句块。 使代码逻辑更清晰 避免过多的全局变量 封装后避免相同逻辑重复...

Besmall ⋅ 2017/11/01 ⋅ 0

匿名函数和闭包

真正的匿名函数 在PHP5.3引入的众多功能中, 除了匿名函数还有一个特性值得讲讲: 新引入的invoke 魔幻方法。 这个魔幻方法被调用的时机是: 当一个对象当做函数调用的时候, 如果对象定义了i...

金于虎 ⋅ 2016/12/23 ⋅ 0

复习PHP-语言参考-函数

1.函数和类的作用域比较奇怪,是全局的。 PHP里的函数不能重载,或取消定义或重定义。 PHP里的函数可以使用递归,但应避免调用超过100/200层,可能会崩溃。 2.函数的参数 PHP 在用户自定义函...

qzd1989 ⋅ 2014/04/23 ⋅ 0

PHP闭包Closure研究

一、闭包概念 接触过JavaScript朋友可能对闭包有所熟悉,因为JS中我们会经常用到闭包函数,非常方便,呐,PHP5.3也开始引入了闭包的特性。要了解闭包,我们先要知道何为匿名函数,也叫闭包函...

Corwien ⋅ 2016/03/18 ⋅ 0

复习PHP-语言参考-预定义接口

1.Traversable 他是一个遍历接口规范 注意:发现一个有用的函数getdeclaredclasses,可以以数组形式显示当前脚本下所有已经定义的类名 2.Iterator Iterator迭代器继承自Traversable,是一种遍...

qzd1989 ⋅ 2014/05/03 ⋅ 0

PHP的匿名函数深入剖析

PHP中, 传递Callback的方式, 一直很丑陋. 在PHP5.3以前, 我们只有俩种选择: 1. 字符串的函数名 2. 使用create_function的返回值 在PHP5.3以后, 我们多了一个选择, 也就是Closure, $func = fu...

西西爱OS ⋅ 2012/10/25 ⋅ 2

JavaScript Functions

JavaScript Functions Parameters js的函数可以接受多个参数 Predefined functions(预定义的函数) There are a number of functions that are built into the JavaScript engine and are ......

秋风醉了 ⋅ 2014/07/16 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 52分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 今天 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部