2011-10-24 10 views
16

estoy tratando de hacer algo como lo siguiente:¿Es posible hacer referencia a una función anónima desde sí mismo en PHP?

// assume $f is an arg to the wrapping function 
$self = $this; 
$func = function() use($f, $ctx, $self){ 

    $self->remove($func, $ctx); // I want $func to be a reference to this anon function 

    $args = func_get_args(); 
    call_user_func_array($f, $args); 
}; 

¿Es posible hacer referencia a la función asignada a $ funcionalidad desde la misma función?

+0

¡Ojalá pudiera marcar todas estas respuestas! – Andrew

+0

Y ojalá una de las respuestas se hubiera desarrollado sobre la creación de referencia y la asignación retrasada. – mario

+2

@mario y me gustaría que te respondieras con el ** que ** crees que es correcto, en lugar de quejarse de las respuestas que la gente pone aquí. – Neal

Respuesta

23

trate de hacer

$func = function() use (/*your variables,*/ &$func) { 
    var_dump($func); 
    return 1; 
}; 

http://codepad.viper-7.com/cLd3Fu

+0

¿Cómo podemos hacerlo sin tener que * nombrar * la función anónima? – Pacerier

+0

@Pacerier No estoy seguro de que sea posible. –

4

sí se puede

Vea este ejemplo: http://php.net/manual/en/functions.anonymous.php#105564


Código de ejemplo:

<?php 
    $fib = function($n) use(&$fib) { 
     if($n == 0 || $n == 1) return 1; 
     return $fib($n - 1) + $fib($n - 2); 
    }; 

    echo $fib(2) . "\n"; // 2 
    $lie = $fib; 
    $fib = function(){die('error');};//rewrite $fib variable 
    echo $lie(5); // error because $fib is referenced by closure 

?> 
4

Sí, es posible si use una variable por referencia. Por ejemplo:

$func = function($i) use(&$func) { 
    if ($i <= 0) { 
     return; 
    } 
    echo "Countdown: $i.\n"; 
    $func($i - 1); 
}; 

$func(3); 
0

Puede ser aún más simple y flexible. Sólo

$func = function($param1, $paramN) { 
    // ... code before recursion entry point 
    // dive deeper using magic constant 
    call_user_func_array(__FUNCTION__, [$param1, $paramN]); 
}; 
Cuestiones relacionadas