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

Как вызвать текущую анонимную функцию в PHP?

У меня есть анонимная функция, которая должна называться сама. Однако у меня нет имени переменной или функции, поэтому я надеялся найти функцию, которая могла бы возвращать "this" в контексте функций. Есть ли такая вещь?

Вот пример:

$f = function() use($bar, $foo) {
  // call this function again.
};

Вызов:

call_user_func(__FUNCTION__);

Приводит к следующему:

Предупреждение: call_user_func() ожидает, что параметр 1 будет действительным обратным вызовом, function '{close}' не найдено или недействительное имя функции

Если я попытаюсь поместить $f в список использования, тогда он говорит, что переменная не определена (потому что она еще не указана).

4b9b3361

Ответ 1

__FUNCTION__ не может использоваться в анонимных функциях

Передайте переменную, содержащую анонимную функцию в качестве ссылки в предложении 'use'.

$f = function() use($bar, $foo, &$f) {
   $f();
};

Совет шляпы к этому answer.

Ответ 2

Хорошо, я узнал, как это сделать:

$f = function() use(&$f) {
  $f();
};

$f();

Главное - передать $f в качестве ссылки. Таким образом, PHP не пытается передать значение, а ссылается на слот памяти.

Ответ 3

У меня есть анонимная функция, которая должна вызывать себя.

Я предпочитаю использовать 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! для повторного запуска кода.

Ответ 4

http://www.php.net/manual/en/language.constants.predefined.php

Изменить: Добавлено до того, как был указан код. Конечно, это не работает с анонимными функциями.

call_user_func(__FUNCTION__, $param1, $param2);
call_user_func_array(__FUNCTION__, $params);

Ответ 5

function i_dont_know() {
    call_user_func(__FUNCTION__,$params);
 //or
    $funcname = __FUNCTION__;
    $funcname($params);


}