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

问题描述 投票:0回答:5

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 closures iife
5个回答
27
投票

PHP 7 添加了执行此操作的功能。

此代码:

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

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


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

11
投票

可以打电话给他们吗? 像我们一样分配给标识符 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


3
投票
看起来不像,因为它们仍然必须使用

function() {}

 表示法进行声明,并且在我的 5.3.2 安装中,尝试您的示例概念会返回 
unexpected '('
 语法错误。关于闭包的
文档页面也没有提及。

也许一旦他们修补解析器以允许

somefunction()[2]

 数组解引用,这将成为可能。


-1
投票
示例1

(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"; });
    
© www.soinside.com 2019 - 2024. All rights reserved.