Search code examples
phpclosuresanonymous-functionargument-passing

PHP: Pass anonymous function as argument


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
)

Solution

  • 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());