2010-08-31 59 views
17

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'); 
}; 
+4

闭包是不具有完全的代名词匿名函数,尽管PHP中的匿名函数的类型为“Closure”。就这样你知道。 – BoltClock 2010-08-31 02:21:41

+0

当您尝试第二个代码示例时,确切的错误是什么? '错误'有点不明确。 – BoltClock 2010-08-31 02:31:40

+0

无法使用$ this作为词法变量 – 2010-08-31 02:39:30

回答

11

是否有可能在没有 的情况下调用它们而不像我们在 中那样进行标识?例如

不在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'); 
}; 

但是,这可让您使用唯一的公共成员,试图访问私有成员仍将给你一个错误。

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

+3

+1虽然在PHP中不能自行调用像“(function(){})();'这样的匿名函数,但也可能出于同样的原因,如Marc B所指出的那样,数组解引用还不行。 – BoltClock 2010-08-31 02:46:45

+0

@BoltClock BTW array dereferrencing(例如:'function foo(){return $ someArray;}','$ var = foo()['bar']')也可以在PHP 5.4中工作 – NullUserException 2012-11-14 22:37:11

3

看起来不像它,因为他们仍然有与function() {}符号声明,并在我的5.3.2安装,试图您的样品概念返回unexpected '('语法错误。关闭的doc page也没有提到它。

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

+1

已将数组解引用添加到[PHP 5.4](http://www.php.net/manual/en/migration54.new-features.php),但您仍然无法在其后调用匿名函数宣言。 – NullUserException 2012-11-14 22:40:22

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

OP如何创建类属性关闭可以访问吗? – 2011-11-17 18:07:35

+0

op可以通过use语句创建一个对象传递给闭包的引用,例如:$ obj = $ this; call_user_func(function()use($ obj){})。这样他就可以访问闭包中的类属性和方法。黑客的位,但它是我们有最好的,直到PHP 5.4到达。 – Jeremy 2011-11-29 20:24:21

15

PHP 7增加了这项功能。

此代码:

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

作品正如人们所预料的PHP 7(它仍然没有任何PHP 5.x的发行工作)

+0

真棒功能。 – 2016-01-28 18:09:44