当一个实例化的类可以使用$this
而一个静态方法可以使用self
等时,它总是让我觉得递归函数需要命名自己。
在递归函数中是否有类似的方法可以在不重命名的情况下执行此操作(只是为了减少维护)?
显然我可以使用call_user_func
或__FUNCTION__
常数,但我更喜欢不那么丑陋的东西。
答案 0 :(得分:10)
您可以使用variable functions并在函数开头(或任何地方)声明一个带有函数名的变量。无需call_user_func
:
function test($i) {
$__name = __FUNCTION__;
if($i > 5) {
echo $i. "\n";
$__name($i-1);
}
}
不要忘记使用真实的函数名称对其他人来说可能更具可读性:) (至少提供评论为什么你这样做)
<强>更新强>:
正如@Alix在他的评论中提到的那样,将$__name
声明为static
可能会有用。这样,该值不会一次又一次地赋值给变量。
答案 1 :(得分: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__
常量来做到这一点。
答案 2 :(得分:2)
function anyfunc() {
__FUNCTION__();
}
如果在课堂上使用:
protected function anymethod() {
$this->{__FUNCTION__}();
}
答案 3 :(得分:0)
对于那些想要在静态方法中执行此操作的人:
forward_static_call(array('self', __METHOD__), $arg1, $arg2, $etc);
这样一来,如果重命名该方法,你也不必担心改变其中的所有递归调用。
答案 4 :(得分: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);