2011-11-29 23 views
23

我有一個匿名函數應該自己調用。但是,我沒有變量或函數名稱,所以我希望找到一個可以在函數的上下文中返回「this」的函數。有這樣的事嗎?如何在PHP中調用當前的匿名函數?

下面是一個例子:

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

調用是這樣的:

call_user_func(__FUNCTION__); 

導致這個:

警告:call_user_func()預計參數1是一個有效的回調, 未找到函數'{closure}'或函數名無效

如果我試圖將$ 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即可。 –

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聲明使該函數可用。通過use聲明

$bar = 10; 
$foo = 0; 

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

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

Working example

函數傳遞的參數傳遞

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

功能,點擊編輯 - >ideone吧!重新運行代碼。