在单个语句中创建和调用匿名函数

Sho*_*waz 18 php closures

php闭包或匿名函数用于创建函数而不指定其名称.

是否可以像在JavaScript中那样分配标识符来调用它们?例如

(function(){
    echo('anonymous function');
})();
Run Code Online (Sandbox Code Playgroud)

use在定义匿名函数时构造的正确用法是什么?在具有私有属性可访问性的公共方法中,匿名函数的状态是什么?

$anon_func = 
function($my_param) use($this->object_property){ //use of $this is erroneous here
    echo('anonymous function');
};
Run Code Online (Sandbox Code Playgroud)

ste*_*red 20

call_user_func(function() use(closure-vars){ ... });
Run Code Online (Sandbox Code Playgroud)


jba*_*ord 20

PHP 7增加了执行此操作的能力.

这段代码:

(function() { echo "This works as expected in PHP 7.\n"; })();
Run Code Online (Sandbox Code Playgroud)

在PHP 7中可以正常工作.(它仍然不适用于任何PHP 5.x.版本)


Nul*_*ion 11

是否可以像在JavaScript中那样分配标识符来调用它们?例如

不是PHP 5.x; 除非你的方法将回调作为参数时计算它.例如:

$square = array_map(function ($v) { return $v*$v; }, $array);
Run Code Online (Sandbox Code Playgroud)

定义匿名函数时使用构造的正确用法是什么

use关键字指示从当前词法作用域变量应该被导入到闭合.您甚至可以通过引用传递它们并更改传递的变量,例如:

$total = 0;
array_walk($array, function ($v) use (&$total) { $total += $v; });
// $total is now the sum of elements in $array
Run Code Online (Sandbox Code Playgroud)

具有私有属性可访问性的公共方法中匿名函数的状态是什么?

一个类中定义闭包可以完全访问其所有属性和方法,包括不需要输入私房$this通过关键字usePHP 5.4:

// this works fine in PHP 5.4
$anon_func = 
function($my_param) { 
    $thing = $my_param + $this->object_property;
    echo('anonymous function');
};
Run Code Online (Sandbox Code Playgroud)

请注意,由于某些奇怪的原因,在PHP 5.3中删除$this对闭包的支持.在此版本中,您可以使用以下方法解决此限制:

// a workaround for PHP 5.3
$temp = $this;

$anon_func = 
function($my_param) use ($temp) { 
    $thing = $my_param + $temp->object_property;
    echo('anonymous function');
};
Run Code Online (Sandbox Code Playgroud)

但这只允许您访问公共成员,尝试访问私有成员仍然会给您一个错误.

另请注意,无论PHP版本如何,尝试导入$this(via use)都会导致致命错误Cannot use $this as lexical variable.

  • +1不可能在PHP中自行调用像`(function(){})();`这样的匿名函数,可能出于同样的原因,正如Marc B指出的那样,数组解除引用还不可行. (3认同)