2010-04-27 24 views
12

它總是竊聽我的遞歸函數需要名稱本身,當一個實例化的類可以使用$this和靜態方法可以使用self你可以讓PHP函數遞歸而不重複它的名字嗎?

有沒有類似的方式在一個遞歸函數來做到這一點,而無需再次將其命名爲(只是爲了減少維修)?

顯然我可以使用call_user_func__FUNCTION__不變但我寧願不那麼醜陋。

+2

+1真石榴石的問題... – 2010-04-27 05:35:59

+5

爲什麼'__FUNCTION__'醜嗎?似乎是實現你想要的一種非常好的方式... – 2010-04-27 05:44:10

+0

@Felix,因爲它可能會需要被添加到'call_user_func'或'eval'。我寧願像'自::($ VAR)' – alex 2010-04-27 05:45:37

回答

9

您可以使用variable functions,並在年初宣佈與功能名稱的變量,你函數(或地方)。無需call_user_func

function test($i) { 
    $__name = __FUNCTION__; 
    if($i > 5) { 
     echo $i. "\n"; 
     $__name($i-1); 
    } 
} 

不要忘記使用真實函數的名稱可能是更可讀的其他人:)
(至少提供評論爲什麼你這樣做)


更新
作爲@Alix在他的評論中提到,它可能是申報有用as static。這樣,該值不會一遍又一遍地分配給變量。

+0

忘了那些。這看起來好於'call_user_func_array()'。謝謝+1 – alex 2010-04-27 05:53:56

+0

+1,這就是作弊! = P – 2010-04-27 05:58:05

+0

我同意你的最後一點。不過,我覺得你應該能夠在不中斷遞歸調用的情況下重命名一個函數。儘管我確實意識到改變函數名稱會在別處打斷它的任何調用。我想這就是爲什麼你應該從一開始就選擇真正好的函數名稱! – alex 2010-04-27 06:01:44

5

我不知道這是爲什麼醜:

return call_user_func_array(__FUNCTION__, func_get_args()); 

對戰:

return call_user_func_array('someFunction', func_get_args()); 

你仍然需要使用call_user_func_array()如果你正在尋找削減維護(如果你的函數有很多/不同的參數)。

除此之外I don't see another way。還一個靜態方法不能引用本身使用self::,只有它的類。你也需要使用魔術__METHOD__這個常數來做到這一點。

+1

關於'self ::',這就是我的意思。你可以用同一個類訪問其他方法。我只是覺得它比較像「self」這樣簡單的東西看起來很醜。 – alex 2010-04-27 05:47:36

+0

感謝您的回答Alix +1 – alex 2010-04-27 05:56:35

+0

@alex:謝謝,沒問題! =) – 2010-04-27 06:04:33

0

對於那些你們誰想要一個靜態方法中做到這一點:

forward_static_call(array('self', __METHOD__), $arg1, $arg2, $etc); 

這樣,如果該方法被重命名你不必擔心太多改變內所有的遞歸調用。

2
function anyfunc() { 
    __FUNCTION__(); 
} 

如果在課堂上使用:

protected function anymethod() { 
    $this->{__FUNCTION__}(); 
} 
0
function self(){ 
    return call_user_func_array(debug_backtrace()[1]['function'], func_get_args()); 
} 

function test($i) { 
    if($i) { 
     echo "$i<br>\n"; 
     self($i-1); 
    } 
} 
test(5); 
相關問題