2011-10-24 45 views
16

我試圖做類似如下:是否可以在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); 
}; 

是否有可能從具有相同功能的引用分配到$ FUNC功能?

+0

哇,我希望我可以標記所有這些作爲答案! – Andrew

+0

我希望其中一個答案能詳細闡述參考創建和延遲分配。 – mario

+2

@mario,我希望你能用自己認爲正確的那個**來回答自己,而不是抱怨人們放在這裏的答案。 – Neal

回答

23

嘗試做

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

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

+0

我們如何做到這一點,而不必*名稱*匿名功能? – Pacerier

+0

@Prier我不確定這是可能的。 –

4

是的,你可以

見這個例子:http://php.net/manual/en/functions.anonymous.php#105564從例如


代碼:

<?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

是的,如果你通過引用use一個變量是可能的。例如:

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

$func(3); 
0

它可以更加簡單和靈活。只是

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