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