Ответ 1
Простейшее обходное решение на сегодняшний день:
echo call_user_func(function () { return 'foo'; });
Обновление. Начиная с PHP7, теперь можно использовать анонимную функцию разыменования с помощью синтаксиса:
$array[] = [
'new' => (function()
{
...
return mt_rand();
})(),
'or' => getClosure()()
]
Оригинальное сообщение: я недавно экспериментировал с некоторыми вещами и задавался вопросом, есть ли способ использовать возвращаемое значение анонимной функции
Допустим, у меня был цикл for, который сделал массив, в котором каждое значение массива должно было иметь вызов базы данных, что я хотел бы сделать:
for($i = 0; $i != 10; $i++)
{
$array[] = [
'new' => function(){
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
},
'old' => function(){
return mt_rand();
}
];
}
или, может быть
echo function(){
// again, we'll just use mt_rand
return mt_rand();
};
Они оба возвращают класс closure
. Нужно ли вообще передавать возвращаемое им значение обратно в массив или эхо для приведенных выше примеров?
Обновление: я установил, что это невозможно, поэтому запрос функции можно найти здесь: http://bugs.php.net/bug.php?id=64608
Простейшее обходное решение на сегодняшний день:
echo call_user_func(function () { return 'foo'; });
Попробуйте назначить анонимную function
переменной.
$myFunc = function() {
return 'Test';
}
echo $myFunc(); // Outputs Test
Значение самой функции не является возвращаемым значением. Возвращаемое значение - это значение, возвращаемое функцией при called
функции.
Редактировать:
Как было предложено путем deceze, вы можете использовать call_user_func()
. Другой способ добиться того, что вы хотите, - использовать php eval()
, что отнюдь не является хорошей практикой кодирования.
$array[] = array(
'new' => call_user_func(function() {
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
}),
'old' => call_user_func(function() {
return mt_rand();
}),
);
echo eval('$x = function() {
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
}; return $x();');
Закрытие, похоже, должно быть назначено, прежде чем его можно будет отменить - попробуйте этот код ниже:
for($i = 0; $i != 10; $i++)
{
$array[] = [
'new' => call_user_func(function(){
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
}),
'old' => call_user_func(function(){
return mt_rand();
})
];
}
[edit] - Изменено для использования call_user_func() вместо пользовательской функции - doh!
Вы должны назначить функцию var, посмотрите здесь
Эта работа
for($i = 0; $i != 10; $i++)
{
$array[] = [
'new' => function(){
// some proccesing here maybe
// lets use mt_rand for this example.
return mt_rand();
},
'old' => function(){
return mt_rand();
}
];
}
echo $array[5]['new']();
или
$function = function(){
// again, we'll just use mt_rand
return mt_rand();
};
echo $function();