为什么这段代码会导致无限递归?
class Foo {
public static function newFoo() { return new Foo(); }
public function __toString() {
return "{${Foo::newFoo()}}";
}
}
echo new Foo(); // Infinite recursion
new Foo(); // Finishes normally
这是因为__toString()
返回一个对象吗?但这是不可能的,因为根据docs
此方法必须返回一个字符串,否则将触发致命的E_RECOVERABLE_ERROR级别错误。(ref)
或者它只是在__toString()
方法中无限递归?
echo new Foo();
创建一个Foo
并尝试echo
它,这样做它将对象转换为调用魔术方法__toString
的字符串。
但是,在该方法中,您调用静态方法Foo::newFoo
,该方法返回一个新对象,该对象在__toString
本身中再次被强制转换为string,因此再次被调用。
是的,这是无限递归
澄清:
public function __toString() {
return "{${Foo::newFoo()}}";
}
等价于
public function __toString() {
$foo = Foo::newFoo();
return "$foo"; // this is a cast as string, which invokes __toString() again.
}
因为你正在无限地调用它。
你响应了echo new Foo();
然后用
再次调用'return "{${Foo::newFoo()}}";'
public static function newFoo() { return new Foo(); }
下面是一个模拟示例:
echo new Foo();
将调用:
public function __toString() {
return "{${Foo::newFoo()}}";
}
//你打电话给
public static function newFoo() { return new Foo(); }
//将再次执行
public function __toString() {
return "{${Foo::newFoo()}}";
}
//并将再次调用
public static function newFoo() { return new Foo(); }
//将反复执行
public function __toString() {
return "{${Foo::newFoo()}}";
}
//并且会反复调用
public static function newFoo() { return new Foo(); }
Ooooohhh我已经在无限循环中了,我只是在开玩笑。
但是,是的,这是一个无限循环…