2011-11-29 21 views
23

Tengo una función anónima que se supone que se llama a sí misma. Sin embargo, no tengo ninguna variable o nombre de función a la mano, así que esperaba encontrar una función que pudiera devolver "this" en el contexto de las funciones. ¿Hay tal cosa?¿Cómo llamar a la función anónima actual en PHP?

Aquí está un ejemplo:

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

Calling como esto:

call_user_func(__FUNCTION__); 

conduce a esta:

Advertencia: call_user_func() espera parámetro de 1 a ser una devolución de llamada válida, función '{closure}' no encontrada o nombre de función no válida

Si trato de poner $ f en la lista de uso, entonces dice que la variable no está definida (porque aún no está).

+0

Publicar tu código te ayudará. –

+2

Deje de votar las respuestas, su pregunta original no mencionó la función anónima en ninguna parte. Debe darles tiempo para editar o eliminar. – Esailija

+0

Ver http://stackoverflow.com/questions/2480179/anonymous-recursive-php-functions –

Respuesta

45

__FUNCTION__ no se pueden utilizar en funciones anónimas

Pasar la variable que contiene la función anónima como referencia en la cláusula de 'uso' ....

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

punta del sombrero a esto answer.

+0

También puede llamar a la función 'f'. –

-1

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

Editar: publicación antes que se diera código. Por supuesto, no funciona en funciones anónimas.

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

Advertencia: call_user_func() espera que el parámetro 1 sea una devolución de llamada válida, no se encuentra la función '{closure}' o el nombre de función no es válido – Tower

7

bien, descubrí la manera de hacer esto:

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

$f(); 

La clave es pasar $ f como referencia. Por lo tanto, PHP no intenta pasar un valor, sino una referencia a una ranura de memoria.

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


} 
0

Tengo una función anónima que se supone que se llama a sí misma.

Prefiero usar call_user_func_array(__FUNCTION__, $params); cuando llamo a una función recursiva.

Como su ejemplo no tiene ningún argumento, supongo que call_user_func(__FUNCTION__); sería más adecuado.

Esperaría y espero que el siguiente código funcione, pero sería demasiado fácil.

$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(); 

El __FUNCTION__"Magic constant" no está disponible para el cierre de modo que el código necesita ser adaptado para permitir el paso de la variable de función. podemos hacer que la función esté disponible pasándola como un argumento normal o mediante la instrucción use.

Función pasa como argumento

$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); 

Función pasó a través de use comunicado

$bar = 10; 
$foo = 0; 

$__FUNCTION__ = function() use (&$bar, $foo, &$__FUNCTION__) { 

    if($bar){ 
     echo $bar-- . PHP_EOL; 
     call_user_func($__FUNCTION__); 
    } 
}; 
$__FUNCTION__(); 

Working example, haga clic en Editar->Ideone él! para volver a ejecutar el código.

Cuestiones relacionadas