闭包和匿名函数在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闭包上