PHP echo语句中的无限递归
为什么这段代码会导致无限递归PHP echo语句中的无限递归,php,recursion,infinite-loop,tostring,Php,Recursion,Infinite Loop,Tostring,为什么这段代码会导致无限递归 class Foo { public static function newFoo() { return new Foo(); } public function __toString() { return "{${Foo::newFoo()}}"; } } echo new Foo(); // Infinite recursion new Foo(); // Finishes normally 这是因为\uuu
class Foo {
public static function newFoo() { return new Foo(); }
public function __toString() {
return "{${Foo::newFoo()}}";
}
}
echo new Foo(); // Infinite recursion
new Foo(); // Finishes normally
这是因为\uuu toString()
正在返回一个对象吗?但这不可能,因为根据文件
此方法必须返回字符串,否则将发出致命的E_可恢复错误级别错误。()
或者它只是在\uu toString()
方法中无限递归
echo new Foo();
创建一个Foo
并尝试echo
它,为此它将对象强制转换为字符串,调用magic方法\uuuu-toString
但是,在该方法中,您调用静态方法Foo::newFoo
,该方法返回一个新对象,该对象再次在\uuu toString
本身中转换为字符串,因此再次调用该对象
是的,这里是无限递归
澄清:
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 function __toString() {
return "{${Foo::newFoo()}}";
}
//我会再打电话给你
public static function newFoo() { return new Foo(); }
public static function newFoo() { return new Foo(); }
//并将一次又一次地执行
public function __toString() {
return "{${Foo::newFoo()}}";
}
public function __toString() {
return "{${Foo::newFoo()}}";
}
//而且会一次又一次的打电话
public static function newFoo() { return new Foo(); }
public static function newFoo() { return new Foo(); }
ooooohh我已经处于无限循环中了,我只是在开玩笑
但是是的,这是一个无限循环 该方法正在返回字符串,但是将对其返回的字符串进行计算,因为您在其周围加了双引号。因此函数签名得到满足,它返回一个字符串。邪恶的部分随后发生,因为字符串是eval()
d。问题是\u toString
必须返回一个字符串。在OP的例子中,它确实返回一个字符串,但该字符串用双引号括起来,所以它也会被计算,这就是造成混淆的原因。但是,@Mjh谢谢你的意见,我试图编辑答案使其更清楚。我想是这样的。引起无限递归的好方法。谢谢大家的分析。