重複の可能性:
PHP はここで無限再帰をどのように回避しますか?
誰かがこれを php #wtf として Twitter に投稿しました:
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 がまだ存在しないため、おそらくコードに含まれていたものです。 in __get() が処理することになっています。PHP は無限再帰を自動検出し、そこで停止します。これは理にかなっていますが、一方、PHP は未定義のプロパティ A::$b に対してのみ E_NOTICE エラーを返します。
私の質問は、PHP が無限再帰を自動検出することは正しいですか? どうすればわかりますか?または、与えられた出力を説明する他の理由がありますか?