PHP echo语句中的无限递归


Infinite recursion in PHP echo statement

为什么这段代码会导致无限递归?

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我已经在无限循环中了,我只是在开玩笑。

但是,是的,这是一个无限循环…