【问题标题】:PHP: Pass anonymous function as argumentPHP:将匿名函数作为参数传递
【发布时间】:2011-05-11 02:27:54
【问题描述】:

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

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
)

【问题讨论】:

  • 你可能已经在 J​​avascript 中看到了 (function () { })(),但是 PHP 的函数没有那么灵活。

标签: php closures anonymous-function argument-passing


【解决方案1】:

最近,我正在解决类似的问题,因此我发布了按预期工作的代码:

$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

【讨论】:

  • 太糟糕了,与其他答案相比,这个答案太新了,但这绝对是对我的帮助,谢谢!
  • 功能性 php 的好资源很少,但实际上当我尝试使用闭包时,php 的行为真的很奇怪。
【解决方案2】:

您传递的是函数本身,而不是您注意到的结果。您必须立即执行该函数,执行如下操作:

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

PHP 不支持这样的事情,所以你不得不将该函数分配给某个变量并执行它:

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

【讨论】:

  • 真的吗?我们是否必须经常在说 PHP 的道路上走下去(说它很糟糕,而不是指出缺陷)?这么多的仇恨......如果你认为它很糟糕,那很好。克服它...
  • 谢谢Crozin;我将不得不考虑其他选择。
【解决方案3】:

你不能。您必须先调用它。由于 PHP 还不支持闭包取消引用,你必须先将它存储在一个变量中:

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

【讨论】:

  • 谢谢ircmaxell;该死,我想我见过的作为参数传递的闭包在传递给它们的函数体中的某个点被调用。太糟糕了。
  • 几年后...is possible
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多