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我已经在无限循环中了,我只是在开玩笑..
但是,是的,这是一个无限循环..
为什么这段代码会导致无限递归?
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我已经在无限循环中了,我只是在开玩笑..
但是,是的,这是一个无限循环..