Подтвердить что ты не робот

PHP: передать анонимную функцию в качестве аргумента

Возможно ли передать анонимную функцию в качестве аргумента и выполнить ее немедленно, передав функцию 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
)
4b9b3361

Ответ 1

Вы не можете. Вы должны сначала позвонить ему. И поскольку PHP еще не поддерживает закрытие де-ссылки, вам сначала нужно сохранить его в переменной:

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

Ответ 2

Недавно я решал аналогичную проблему, поэтому я отправляю свой код, который работает как ожидалось:

$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: Отвечено благодаря этим ответам: ответы

Ответ 3

Вы передаете функцию, а не результаты, как вы заметили. Вам нужно будет выполнить эту функцию, немедленно сделав что-то вроде этого:

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

PHP не поддерживает такие вещи, поэтому вам придется назначить эту функцию некоторой переменной и выполнить ее:

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