- 2006-11-17 (金) 0:42
- PHP
この記事の所要時間: 約 2分2秒
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特有の現象というわけでは無さそうです。
- Newer: livedoor Readerで「ピンを開く」数を増やす
- Older: CakePHP1.1.10.3825-bake.php修正パッチ
トラックバック:0
- このエントリーのトラックバックURL
- /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