PHP:传递一个带参数的函数作为参数

时间:2010-06-05 10:57:57

标签: php lambda

我不确定这个愚蠢的问题,但我问:
因此,如果有一个匿名函数,我可以将它作为另一个匿名函数参数,如果它已经存储了一个变量。
但是,在这种情况下,如果我只在变量中存储了一个函数,并将第二个函数作为参数直接添加到其中?我可以在非存储函数中添加参数吗?

拳头示例(这就是我的理解:)):

$func = function($str){ return $str; };
$func2 = function($str){ return $str; };
$var = $func($func2('asd'));

var_dump($var);
// prints out string(3) "asd"

这对我来说很有意义,但是下面的内容是什么?

$func = function($str){ return $str; };
$var = $func(function($str = "asd"){ return $str; });

var_dump($var);

/** This prints out:
object(Closure)#1 (1) {
  ["parameter"]=>
  array(1) {
    ["$str"]=>
    string(10) ""
  }
}
But why?
*/

最后,有人可以推荐我一本书或一篇文章,从中我可以学习php的这个lambda编码功能吗?

4 个答案:

答案 0 :(得分:6)

$func只返回其参数,所以:

$var = $func(function($str = "asd"){ return $str; });

与:

相同
$var = function($str = "asd"){ return $str; };

匿名函数是Closure的实例这一事实是一个实施细节the docs警告不要依赖。 Closure没什么特别之处。由于__invoke魔术方法,它可以在常规PHP中实现。

在我的PHP 5.3.2安装中,Closure具有不同的表示。该参数标有"<optional>"字符串。也许这是格式化问题。

php > $func = function($str){ return $str; };
php > $var = function($str = "asd"){ return $str; };
php > var_dump($var);
object(Closure)#2 (1) {
  ["parameter"]=>
  array(1) {
    ["$str"]=>
    string(10) "<optional>"
  }
}

答案 1 :(得分:2)

在第二个例子中,$ func只返回通过参数设置的函数..

向您展示的最简单方式就是这样..

$func = function($str){ return $str(); }; 
$var = $func(function($str = "asd"){ return $str; }); 

var_dump($var); 

注意$ func

中'return $ str'之后的()

回复评论:

$func = function($str, $value){ return $str($value); }; 
$var = $func(function($str = "asd"){ return $str; }, 'efg'); 

var_dump($var); 

答案 2 :(得分:2)

$func = function($str){ return $str; };
$var = $func(function($str = "asd"){ return $str; });

var_dump($var);

首先定义一个函数$func,它只返回第一个参数。所以$ var变为function($str = "asd"){ return $str; }

我可以推荐有关闭包和lambda函数http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html的IBM文章。

答案 3 :(得分:0)

 $func = function($str){ return $str; };

使用__invoke()函数生成关闭对象

此对象在第二个示例中作为参数传递。 因为anonimimus函数返回输入,var_dump()显示函数对象而不是结果

不支持太糟糕的链接(比如在javascript中)

 $func = function($str){ return $str; };
 $var = $func(function($str = "asd"){ return $str; }('test'));
 var_dump($var);

可能导致“test”但会生成 PHP Parse错误:语法错误,意外'('