PHP匿名函数使用细节

123 阅读1分钟

匿名函数使用细节

值传递

创建匿名函数的时候,使用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();