PHP 闭包或匿名函数用于创建函数而不指定其名称。
是否可以像 JavaScript 中那样在不分配标识符的情况下调用它们? 例如
(function(){
echo('anonymous function');
})();
定义匿名函数时,
use
构造的正确用法是什么?匿名函数在可访问私有属性的公共方法中的状态是什么?
$anon_func =
function($my_param) use($this->object_property){ //use of $this is erroneous here
echo('anonymous function');
};
PHP 7 添加了执行此操作的功能。
此代码:
(function() { echo "This works as expected in PHP 7.\n"; })();
在 PHP 7 中可以正常工作。(它仍然无法在任何 PHP 5.x. 版本中工作)
call_user_func(function() use(closure-vars){ ... });
可以打电话给他们吗? 像我们一样分配给标识符 JavaScript ?例如
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');
};
请注意,由于某些奇怪的原因,在 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');
};
但这只能让您访问公共成员,尝试访问私有成员仍然会出现错误。
另请注意,尝试导入
$this
(通过
use
),无论 PHP 版本如何,都会导致致命错误
Cannot use $this as lexical variable
。
function() {}
表示法进行声明,并且在我的 5.3.2 安装中,尝试您的示例概念会返回
unexpected '('
语法错误。关于闭包的文档页面也没有提及。 也许一旦他们修补解析器以允许
somefunction()[2]
数组解引用,这将成为可能。
(new class {
function __invoke($n) {
echo "in PHP 7.\n";
}
})(0);
示例2
(function() { echo "in PHP 7.\n"; })();
示例3
call_user_func(function() { echo "in php> 5.6\n"; });