可能的重复:
PHP 如何在这里避免无限递归?
有人在 Twitter 上将此作为 php #wtf 发布:
class A
{
private $b;
function __construct()
{
unset($this->b);
}
function __get($n)
{
echo '!broken!';
return $this->$n;
}
}
$a = new A;
$a->b; //EDIT: original question had var_dump($a->b);
//output:
!broken!!broken!
我对此的第一反应是 $a->b 为第一个回显触发 __get() ,然后返回 $this->$n 再次触发 __get 导致 $this->b 仍然不存在,这大概是包含的代码在 __get() 应该处理。PHP 自动检测无限递归并停在那里。这是有道理的,但另一方面,PHP 只对欠精细的属性 A::$b 给出 E_NOTICE 错误。
所以我的问题是,我对 PHP 自动检测无限递归是否正确?我怎么知道?还是有其他原因来解释给出的输出?