代码之家  ›  专栏  ›  技术社区  ›  Dan Lugg mab

PHP:将匿名函数作为参数传递

  •  12
  • Dan Lugg mab  · 技术社区  · 15 年前

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

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

    由于 Array 类型hint,抱怨传递了一个对象。好吧,如果我去掉类型提示,它当然会吐出来 Closure Object ,而不是我想要的结果。我知道我在技术上传递 Closure myFunction 不过,我几乎可以肯定的是,我在其他地方看到了这一成就。这可能吗?如果是,我做错什么了?

    为了讨论这个问题,我不能修改传递闭包的函数。

    tl;dr:如何将匿名函数声明作为参数传递,从而将返回值作为参数传递。

    注:如果不清楚,所需的输出是:

    Array
    (
        [fruit] => apple
        [vegetable] => broccoli
        [other] => canned soup
    )
    
    3 回复  |  直到 15 年前
        1
  •  10
  •   ircmaxell    15 年前

    你不能。你得先打电话。由于PHP还不支持闭包反引用,因此必须首先将其存储在一个变量中:

    $f = function(){
        $data = array(
            'fruit'     => 'apple',
            'vegetable' => 'broccoli',
            'other'     => 'canned soup');
        return $data;
    };
    myfunction($f());
    
        2
  •  10
  •   Community Mohan Dere    9 年前

    最近,我也在解决类似的问题,所以我发布了我的代码,它可以正常工作:

    $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
    

    希望有帮助。首先,我创建闭包,然后是接受闭包和参数并调用其内部并返回其值的函数。很简单。

    答:感谢您的回答: answers

        3
  •  4
  •   George Claghorn    13 年前

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

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

    PHP不支持这样的东西,因此您不得不将该函数分配给某个变量并执行它:

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