它總是竊聽我的遞歸函數需要名稱本身,當一個實例化的類可以使用$this
和靜態方法可以使用self
等你可以讓PHP函數遞歸而不重複它的名字嗎?
有沒有類似的方式在一個遞歸函數來做到這一點,而無需再次將其命名爲(只是爲了減少維修)?
顯然我可以使用call_user_func
或__FUNCTION__
不變但我寧願不那麼醜陋。
它總是竊聽我的遞歸函數需要名稱本身,當一個實例化的類可以使用$this
和靜態方法可以使用self
等你可以讓PHP函數遞歸而不重複它的名字嗎?
有沒有類似的方式在一個遞歸函數來做到這一點,而無需再次將其命名爲(只是爲了減少維修)?
顯然我可以使用call_user_func
或__FUNCTION__
不變但我寧願不那麼醜陋。
您可以使用variable functions,並在年初宣佈與功能名稱的變量,你函數(或地方)。無需call_user_func
:
function test($i) {
$__name = __FUNCTION__;
if($i > 5) {
echo $i. "\n";
$__name($i-1);
}
}
不要忘記使用真實函數的名稱可能是更可讀的其他人:)
(至少提供評論爲什麼你這樣做)
更新:
作爲@Alix在他的評論中提到,它可能是申報有用as static
。這樣,該值不會一遍又一遍地分配給變量。
我不知道這是爲什麼醜:
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__
這個常數來做到這一點。
對於那些你們誰想要一個靜態方法中做到這一點:
forward_static_call(array('self', __METHOD__), $arg1, $arg2, $etc);
這樣,如果該方法被重命名你不必擔心太多改變內所有的遞歸調用。
function anyfunc() {
__FUNCTION__();
}
如果在課堂上使用:
protected function anymethod() {
$this->{__FUNCTION__}();
}
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);
+1真石榴石的問題... – 2010-04-27 05:35:59
爲什麼'__FUNCTION__'醜嗎?似乎是實現你想要的一種非常好的方式... – 2010-04-27 05:44:10
@Felix,因爲它可能會需要被添加到'call_user_func'或'eval'。我寧願像'自::($ VAR)' – alex 2010-04-27 05:45:37