闭包与匿名函数

闭包和匿名函数在PHP5.3.0中引入,闭包是指在创建时封装周围状态的函数,即便闭包所存在的环境不存在了,闭包中封装的状态依然存在。

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

理论上讲,闭包和匿名函数使用的句法和普通函数时不同的概念。不过,PHP将其视作相同的概念。所以,在PHP中提到的闭包就是指匿名函数,反之亦然

1.创建闭包

<?php
$closure = function ($name){
    return sprintf('Hello %s',$name);
};

echo $closure('Rust');

如上: 创建了一个闭包对象,然后将其赋值给$closure变量。闭包和普通的PHP函数很像:使用相同的句法,也接受参数,而且能返回值。我们之所以能调用$closure变量,是因为这个变量的值是一个闭包,而且闭包对象实现了__invoke()魔术方法。只要变量名后有(),PHP就会查找并调用__invoke()方法。

 

2.闭包作为回调使用

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

  如上:把一个闭包对象作为回调参数传给array_map()函数。在闭包出现之前PHPer别无选择只能单独创建具名函数然后使用名    称引用那个函数,这样做代码执行得稍微慢一点,而且吧回调的实现和使用场所隔离开了

<?php
//实现具名回调
function incrementNumber ($number){
    return $unmber + 1;
}

//使用具名回调
$numberPlusOne = array_map('incrementNumber',[1,2,3]);
print_r($numberPlusOne);

 

3.附加状态

function enclosePerson($name){
    return function () use($name){
        return sprintf('%s, %s',$name,$doCommand);
    };
}

//把字符串"Clay"封装在闭包中
$clay = enclosePerson('Rust');

//传入参数,调用闭包
echo $clay('get me sweet tea');

//输出:Rust,get me sweet tea

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值