2011-10-24 11 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

そして私は、回答の1つがリファレンスの作成と割り当ての遅延について詳しく説明してくれることを願っています。 – 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

@Pacerier私はそれが可能であるかどうかはわかりません。 –

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]); 
}; 
関連する問題