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

时间:2010-08-31 02:15:47

标签: php closures

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

是否可以像在JavaScript中那样分配标识符来调用它们? e.g。

(function(){
    echo('anonymous function');
})();

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

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

4 个答案:

答案 0 :(得分:20)

call_user_func(function() use(closure-vars){ ... });

答案 1 :(得分:20)

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

此代码:

(function() { echo "This works as expected in PHP 7.\n"; })();

在PHP 7中可以正常工作。(它仍然无法在任何PHP 5.x.版本中使用)

答案 2 :(得分:11)

  

是否可以不用来打电话   像我们一样分配给标识符   JavaScript? e.g。

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

$square = array_map(function ($v) { return $v*$v; }, $array);
  

使用的正确用法是什么   在定义匿名时构造   功能

use关键字指示应将当前词法范围中的哪些变量导入到闭包中。您甚至可以通过引用传递它们并更改传递的变量,例如:

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

  

匿名的状态是什么   公共方法中的函数   私人财产的可访问性?

在类中定义的闭包具有对其所有属性和方法的完全访问权限,包括私有属性和方法,无需通过PHP 5.4中的关键字$this导入use

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

请注意,由于某些奇怪的原因支持$this关闭was removed in PHP 5.3。在此版本中,您可以使用以下内容解决此限制:

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

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

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

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

答案 3 :(得分:3)

看起来不像,因为它们仍然必须使用function() {}表示法声明,并且在我的5.3.2安装上,尝试使用示例概念会返回unexpected '('语法错误。封闭上的doc page也没有提到它。

一旦他们修补解析器以允许somefunction()[2]数组解除引用,它们就有可能成为可能。