PHP: передать анонимную функцию в качестве аргумента - PullRequest
12 голосов
/ 17 ноября 2010

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

Ответы [ 3 ]

9 голосов
/ 28 апреля 2015

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

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

9 голосов
/ 17 ноября 2010

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

$f = function(){
    $data = array(
        'fruit'     => 'apple',
        'vegetable' => 'broccoli',
        'other'     => 'canned soup');
    return $data;
};
myfunction($f());
4 голосов
/ 17 ноября 2010

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

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

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

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