Home > PHP > Nesting level too deep – recursive dependency?

Nesting level too deep – recursive dependency?

  • 2006-11-17 (金) 0:42
  • PHP
この記事の所要時間: 22

Big Room » Blog Archive » PHP 5.2 – Nesting level too deep – recursive dependency?でオブジェクト同士の比較で発生するエラーについて書かれています。

class MyObj
{
    public $p;
}
class OtherObj
{
    public $q;
}

$a = new MyObj();
$b = new OtherObj();
$a->p = $b;
$b->q = $a; // the circular reference: $a->p->q === $a

$c = new MyObj();
$d = new OtherObj();
$c->p = $d;
$d->q = $c;// another circular reference: $c->p->q === $c

echo ( $a == $c ); // Fatal error:
?>
Big Room » Blog Archive » PHP 5.2 - Nesting level too deep - recursive dependency? (2006-11-16)

ポイントは循環参照と[==]での比較です。

PHPでは[==]と[===]とで処理結果が異なるのは良く言われていることですが、これはオブジェクト同士でも同様です。オブジェクトの比較にあるように[==]ならオブジェクトの持つ変数同士が比較され、[===]ならオブジェクトの参照が比較されます。(Javaの==とStrings#equals()に似ていますね。)

つまり循環参照しているオブジェクト同士を[==]で比較すると延々オブジェクトの変数が比較され続けてエラーが発生するというわけです。

ちなみにPHP4では[==]も[===]もPHP5の[==]と同じ動作をするようです。(PHP4におけるオブジェクトの比較

呼び出し元のメソッドを使用したい場合にうっかり循環参照になっていたりするので注意が必要です。

 

# エントリではPHP5.1.6では[==]で動作していたようですが、手元の環境では5.1.6でも同じエラーが発生しました。5.2.0特有の現象というわけでは無さそうです。

Pocket

follow us in feedly

トラックバック:0

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2006/11/php_object_comparison.html/trackback
Listed below are links to weblogs that reference
Nesting level too deep – recursive dependency? from Shin x blog

Home > PHP > Nesting level too deep – recursive dependency?

検索
フィード
メタ情報

Return to page top