2011-11-29 12 views
23

私は自分自身を呼び出すはずの無名関数を持っています。しかし、私は変数名や関数名を持っていないので、関数の文脈で "this"を返す関数を見つけることを望んでいました。そんなことはありますか?ここでPHPで現在の無名関数を呼び出すには?

は例です:

call_user_func(__FUNCTION__); 

はこれにリード:

警告:次のように呼び出す

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

call_user_func()は、パラメータ1が有効なコールバックであることを期待します 関数 '{closure}'が見つかりません、または無効な関数名

私はuse-listに$ fを入れようとすると、変数がまだ定義されていないと言います。

+0

コードを投稿すると役立ちます。 –

+2

答えをdownvoting停止、あなたの元の質問はどこにでも匿名関数は言及していませんでした。編集や削除の時間を与えるべきです。 – Esailija

+0

http://stackoverflow.com/questions/2480179/anonymous-recursive-php-functionsをご覧ください。 –

答えて

45

__FUNCTION__は、無名関数で使用することはできません

に....帽子の

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

ヒント「を使用」節の基準と匿名関数を保持する変数を渡しますこのanswer

+0

関数 'f'を呼び出すこともできます。 –

-1

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

編集:コードが与えられた前に投稿されました。もちろん、匿名関数では機能しません。

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

警告:call_user_func()は、パラメータ1が有効なコールバック、関数 '{closure}'が見つからないか、または関数名が無効であると想定しています – Tower

7

さて、私はこれを行う方法を見つけた:

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

$f(); 

重要なのは、参照としてF $を渡すことです。 PHPは値を渡そうとせず、メモリスロットへの参照を渡します。

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


} 
0

私は自分自身を呼び出すはずの無名関数を持っています。

再帰関数を呼び出すときは、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__"Magic constant"コードは、関数の変数の通過を可能にするように適合される必要があるので、クロージャに使用できません。関数を通常の引数として渡すか、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); 

機能が

$bar = 10; 
$foo = 0; 

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

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

Working exampleuse声明を経由して渡され、>ideoneそれを編集 - をクリックしてください!再実行コード

関連する問題