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() 正在返回一个对象吗?但这是不可能的,因为根据文档

This method must return a string, as otherwise a fatal E_RECOVERABLE_ERROR level error is emitted. (ref)

还是在 __toString() 方法中无限递归?

echo new Foo();

创建一个 Foo 并尝试 echo 它,为此它将对象转换为字符串调用魔术方法 __toString.

然而,在该方法中,您调用静态方法 Foo::newFoo,它 returns 一个新对象,它再次被转换为 __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 static function newFoo() { return new Foo(); }

// 并且会一次又一次地执行

public function __toString() {
   return "{${Foo::newFoo()}}"; 
}

// 并会一次又一次地调用

public static function newFoo() { return new Foo(); }

Ooooohhh我已经在无限循环中了,我只是在开玩笑..

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