Ответ 1
__FUNCTION__
не может использоваться в анонимных функциях
Передайте переменную, содержащую анонимную функцию в качестве ссылки в предложении 'use'.
$f = function() use($bar, $foo, &$f) {
$f();
};
Совет шляпы к этому answer.
У меня есть анонимная функция, которая должна называться сама. Однако у меня нет имени переменной или функции, поэтому я надеялся найти функцию, которая могла бы возвращать "this" в контексте функций. Есть ли такая вещь?
Вот пример:
$f = function() use($bar, $foo) {
// call this function again.
};
Вызов:
call_user_func(__FUNCTION__);
Приводит к следующему:
Предупреждение: call_user_func() ожидает, что параметр 1 будет действительным обратным вызовом, function '{close}' не найдено или недействительное имя функции
Если я попытаюсь поместить $f в список использования, тогда он говорит, что переменная не определена (потому что она еще не указана).
__FUNCTION__
не может использоваться в анонимных функциях
Передайте переменную, содержащую анонимную функцию в качестве ссылки в предложении 'use'.
$f = function() use($bar, $foo, &$f) {
$f();
};
Совет шляпы к этому answer.
Хорошо, я узнал, как это сделать:
$f = function() use(&$f) {
$f();
};
$f();
Главное - передать $f в качестве ссылки. Таким образом, PHP не пытается передать значение, а ссылается на слот памяти.
У меня есть анонимная функция, которая должна вызывать себя.
Я предпочитаю использовать call_user_func_array(__FUNCTION__, $params);
при вызове рекурсивной функции.
Как ваш пример не имеет аргументов, я думаю, call_user_func(__FUNCTION__);
будет лучше подходит.
Вы ожидали бы и надеетесь, что следующий код будет работать, но это будет слишком легко.
$bar = 10;
$foo = 0;
$f = function() use (&$bar,$foo) {
if($bar){ // condition needed to prevent infinite loop
echo $bar-- . PHP_EOL;
call_user_func(__FUNCTION__); // wont work
}
};
$f();
__FUNCTION__
"Магическая константа" недоступна для закрытия, поэтому код необходимо адаптировать, чтобы разрешить передачу функциональной переменной. мы можем сделать эту функцию доступной, передав ее как обычный аргумент или с помощью оператора use
.
Функция передана как аргумент
$bar = 10;
$foo = 0;
$f = function( $__FUNCTION__ = null ) use (&$bar, $foo) {
if($__FUNCTION__ && $bar){
echo $bar-- . PHP_EOL;
call_user_func( $__FUNCTION__, $__FUNCTION__);
}
};
$f ( $f );
Функция, переданная через оператор use
$bar = 10;
$foo = 0;
$__FUNCTION__ = function() use (&$bar, $foo, &$__FUNCTION__) {
if($bar){
echo $bar-- . PHP_EOL;
call_user_func( $__FUNCTION__ );
}
};
$__FUNCTION__();
Рабочий пример, нажмите edit- > ideone it! для повторного запуска кода.
http://www.php.net/manual/en/language.constants.predefined.php
Изменить: Добавлено до того, как был указан код. Конечно, это не работает с анонимными функциями.
call_user_func(__FUNCTION__, $param1, $param2);
call_user_func_array(__FUNCTION__, $params);
function i_dont_know() {
call_user_func(__FUNCTION__,$params);
//or
$funcname = __FUNCTION__;
$funcname($params);
}