2010-11-16 83 views
10

是否可以将匿名函数作为参数传递并立即执行,从而传递函数的return值?PHP:传递匿名函数作为参数

function myFunction(Array $data){ 
    print_r($data); 
} 

myFunction(function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}); 

这会引发错误由于Array型提示,抱怨的目的被传递。好的,如果我删除了类型提示,它当然会吐出Closure Object,而不是我想要的结果。我知道我在技术上将Closure的对象实例传递给myFunction,但是,我已经确定我已经在其他地方看到了这一点。这可能吗?如果是这样,我做错了什么?

为了这个讨论,我不能修改我通过闭包的函数。

tl; dr:我如何传递一个匿名函数声明作为参数,导致返回值作为参数传递。

PS:如果不明确,期望的输出是:

Array 
(
    [fruit] => apple 
    [vegetable] => broccoli 
    [other] => canned soup 
) 
+0

你可能已经看到了这一点在JavaScript作为'(函数(){})()',但PHP的功能没有那么灵活。 – deceze 2010-11-16 21:50:25

回答

9

你不能。你必须先打电话给他。而且,由于PHP不支持关闭取消引用的是,你必须先将其存储在一个变量:

$f = function(){ 
    $data = array(
     'fruit'  => 'apple', 
     'vegetable' => 'broccoli', 
     'other'  => 'canned soup'); 
    return $data; 
}; 
myfunction($f()); 
+0

谢谢* ircmaxell *;该死的,我想关闭通过我所看到的参数被称为在他们被传递给函数的主体中的某个点。太糟糕了。 – Dan 2010-11-16 22:10:14

+7

几年后...... [可能](http://php.net/manual/en/functions.anonymous.php) – Alex 2015-08-05 05:21:15

4

你传递函数本身,并不像你注意到的结果。你必须执行该功能会立即做这样的事情:

myFunction((function() { 
    return ...; 
})(), $otherArgs); 

PHP不支持这样的事情,所以你不得不说的功能分配给一些变量并执行它:

$func = function() { ... }; 
myFunction($func(), $otherArgs); 
+13

真的吗?我们是否必须经常走这条糟糕的PHP道路(说这很糟糕,并没有指出缺陷)呢?非常讨厌......如果你认为这很糟糕,那很好。克服它... – ircmaxell 2010-11-16 22:02:26

+0

感谢* Crozin *;我将不得不考虑其他选项。 – Dan 2010-11-16 22:10:43

7

最近,我在解决类似的问题,所以我张贴我的代码工作正常:

$test_funkce = function ($value) 
{ 

    return ($value + 10); 
}; 


function Volej($funkce, $hodnota) 
{ 

    return $funkce->__invoke($hodnota); 
    //or alternative syntax 
    return call_user_func($funkce, $hodnota); 

} 

echo Volej($test_funkce,10); //prints 20 

希望它能帮助。首先,我创建了闭包,然后是接受闭包和参数的函数,并调用它的内部并返回它的值。简直就够了。

PS:回答感谢这个答案: answers

+0

太糟糕了,这个答案与其他答案相比是如此的新颖,但这绝对是帮助我解决问题的方法,谢谢! – 2015-06-19 15:33:52

+0

功能强大的PHP很少有好的资源,但实际上,当我尝试使用闭包时,php的行为真的很奇怪。 – 2015-06-23 13:10:11