浅析PHP中的闭包和匿名函数


Posted in PHP onDecember 25, 2017

闭包是指在创建时封装周围状态的函数。即使闭包所在的环境不存在了,闭包中封装的状态依然存在。

匿名函数就是没有名称的函数。匿名函数可以赋值给变量,还能像其他任何PHP对象那样传递。不过匿名函数仍是函数,因此可以调用,还可以传入参数。匿名函数特别适合作为函数或方法的回调。

注意:理论上讲,闭包和匿名函数是不同的概念。不过,PHP将其视作相同的概念。所以,我们提到闭包时,指的也是匿名函数,反之亦然。

PHP闭包和匿名函数使用的句法与普通函数相同,但闭包和匿名函数其实是 伪装成函数的对象(Closure类的实例) 。

创建闭包

$closure = function($name){
  return sprintf("Hello %s", $name);
}
echo $closure("jerry");
// 检测$closure变量是否是一个闭包
var_dump($closure instanceof Closure);

以上代码创建了一个闭包对象,然后将其赋值给 $closure 变量。闭包和普通的PHP函数很像,使用的句法相同,也接收参数,而且能返回值。

说明:我们之所以能够调用 $closure 变量,是因为这个变量的值是一个闭包,而且闭包对象实现了 __invoke() 魔术方法。只要变量名后有 () ,PHP就会查找并调用 __invoke() 方法。

使用闭包

我们通常把PHP闭包当做当做函数和方法的回调使用。很多PHP函数都会用到回调函数,例如 array_map() preg_replace_callback() .如下示例,我们将用 array_map() 处理数组,将数组每一项自增1:

$nubmers = array_map(function($number){
  return $number++;
}, [1,2,3]);
var_dump($numbers);

附加状态

PHP闭包不会像真正的javascrypt闭包那样自动封装应用的状态,我们必须手动调用闭包对象的 bindTo() 方法或者使用 use 关键字,把状态附加到PHP闭包上。

使用 use 关键字

使用 use 关键字来附加闭包状态更加常见,因此我们先来看这种方式。使用 use 关键字把变量附加闭包上时,附加的变量会记住附加时赋给它的值。

function Car ($name){
  return function($statu)use($name){
    return sprintf("Car %s is %s", $name, $statu); 
  }
}
// 将车名封装在闭包中
$car = Car("bmw");
// 调用车的动作
// 输出--> "bmw is running"
echo $car("running");

注意:使用 use 关键字可以把多个参数传入闭包,此时要像PHP函数或方法的参数一样,使用逗号分隔多个参数。

使用 bindTo() 方法附加闭包的状态

与其它PHP对象类似,每个闭包实例都可以使用 $this 关键字获取闭包的内部状态。闭包对象的默认状态没什么用,不过有一个 __invoke() 魔术方法和 bindTo() 方法。

bindTo() 方法为闭包增加了一些有趣的潜力。我们可以使用这个方法把 Closure 对象的内部状态绑定到其它对象上。

bindTo() 方法的第二个参数很重要,其作用是指定绑定闭包的那个对象所属的PHP类。因此,闭包可以访问绑定闭包的对象中受保护和私有的成员变量。

class TestClosure
{
  private $name=[];
  private $age;
  private $sex;
  public function addPerson($name, $personCallback){
    // 将闭包对象绑定当前实例
    $this->name[$name] = $personCallback->bindTo($this, __CLASS__);
  }
  public function display($name){
    foreach ($this->name as $key => $callback){
      if($key == $name){
        // 执行闭包对象,将闭包状态附加到类
        $callback();
      }
    }
    echo "name : {$name}\n";
    echo "age : {$this->age}\n";
    echo "sex : {$this->sex}\n";
  }
}
$person = new TestClosure();
$person->addPerson("jerry", function(){
  $this->age = 19;
  $this->sex = "man";
});
$person->display("jerry");
/** output
name : jerry
age : 19
sex : man
*/

总结

以上所述是小编给大家介绍的PHP中的闭包和匿名函数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
我的论坛源代码(二)
Oct 09 PHP
PHP4实际应用经验篇(6)
Oct 09 PHP
php防注
Jan 15 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
php去掉文件前几行的方法
Jul 29 PHP
Zend Framework分发器用法示例
Dec 11 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
May 09 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 PHP
php png失真的原因及解决办法
Nov 17 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 #PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 #PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 #PHP
Thinkphp5行为使用方法汇总
Dec 21 #PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 #PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 #PHP
PHP实现生成模糊图片的方法示例
Dec 21 #PHP
You might like
php获得网站访问统计信息类Compete API用法实例
2015/04/02 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
php使用Jpgraph绘制饼状图的方法
2015/06/10 PHP
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
设置点击文本框或图片弹出日历控件的实现代码
2016/05/12 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
微信小程序实现批量倒计时功能
2020/11/01 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
原生js实现瀑布流效果
2020/03/09 Javascript
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Python字符串的常见操作实例小结
2019/04/08 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
天猫超市:阿里巴巴打造的网上超市
2016/11/02 全球购物
6PM官网:折扣鞋、服装及配饰
2018/08/03 全球购物
英文简历中的自我评价用语
2013/12/09 职场文书
致200米运动员广播稿
2014/02/06 职场文书
创建服务型党组织实施方案
2014/02/25 职场文书
给校长的一封建议书
2014/03/12 职场文书
学校节能宣传周活动总结
2014/07/09 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
小浪底导游词
2015/02/12 职场文书
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers