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谢谢你的意见,我试图编辑答案使其更清楚。我想是这样的。引起无限递归的好方法。谢谢大家的分析。