匿名函数使用细节
值传递
创建匿名函数的时候,使用use导入的变量,默认会在创建时,复制一份副本作为匿名函数的本地变量使用。
$i = 0;
$one = function() use($i) {
var_dump($i);
};
$two = function() use($i) {
var_dump($i);
};
$three = function() use(&$i) { // 可以使用引用导入变量
var_dump($i);
};
$i++;
$one();
$two();
$three();
输出:
0
0
1
动态赋值
匿名函数不能动态的赋值给一个实例对象。 如:
$obj = new stdClass();
$obj->func = function() {
echo "hello";
};
$obj->func();
将会引发一个Fatal error。 但可以使用以下方法代替:
$func = $obj->func;
$func();
// or
call_user_func($obj->func);
静态匿名函数的作用
静态的匿名函数能够阻止类自动绑定到它身上。 例:
class Foo
{
function __construct() {
$func = function() {
var_dump($this);
};
$func();
}
}
new Foo();
运行以上代码将会报异常!
匿名的静态函数也不能用bindTo绑定到一个实例上。
$func = static function() {
echo "hello";
};
$func->bindTo(new stdClass);
$func();
运行这段代码也会引发一个警告:
PHP Warning: Cannot bind an instance to a static closure
匿名函数的递归
需要递归的匿名函数use引用自身的时候,必须要有引用符号“&”的,否则引发错误:“Notice: Undefined variable: func”。
$a = ['hello', 'world'];
$func = static function() use(&$a, &$func) {
if (empty($a)) return false;
var_dump(array_shift($a));
$func();
};
$func();