PHP: Pass anonymous function as argument

我怕爱的太早我们不能终老 提交于 2019-12-05 15:02:21

问题


Is it possible to pass an anonymous function as an argument, and have it execute immediately, thus passing the function's return value?

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

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

This throws an error due to the Array type-hint, complaining of an object being passed. Alright, if I remove the type-hint, it of course spits out Closure Object, rather than the results I want. I understand that I am technically passing an object instance of Closure to myFunction, however, I'm near certain that I've seen this accomplished elsewhere. Is this possible? If so, what am I doing wrong?

For the sake of this discussion, I cannot modify the function to which I'm passing the closure.

tl;dr: How can I pass an anonymous function declaration as an argument, resulting in the return value being passed as the argument.

PS: If not clear, the desired output is:

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

回答1:


You can't. You'd have to call it first. And since PHP doesn't support closure de-referencing yet, you'd have to store it in a variable first:

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



回答2:


Recently, I was solving similar problem so I am posting my code which is working as expected:

$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

Hope it helps. First, I am creating closure, then function which accepts closure and argument and is invoking its inside and returning its value. Simply enough.

PS: Answered thanks to this answers: answers




回答3:


You're passing the function itself, not the results as you noticed. You'd have to execute that function immediately doing something like this:

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

PHP doesn't support such things, so you're forced to assign that function to some variable and execute it:

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


来源:https://stackoverflow.com/questions/4199307/php-pass-anonymous-function-as-argument

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!