- ベストアンサー
PHP5 オブジェクトのリファレンスとデストラクタ
PHP5.0.4を使っています。 原因不明の現象に悩まされていましたが、再現する最小限のコードがわかりました。 class Foo { function __destruct() { } } $bar=&new Foo(); $bar=&new Foo(); というコードで、最初の$barへの代入ではちゃんとFooクラスのオブジェクトへのリファレンスが代入されますが、2回目の代入では結果として$barはNULLになってしまいます。 (1)リファレンスでなく値の代入にする (2)変数名を変える (3)2回目の代入の前に$barをunset()する (4)デストラクタの宣言を削除する のいずれかで2回目もFooオブジェクトが$barに代入されるのですが、(1)は実際はそこそこ大きいオブジェクトなのでコピーするのは無駄、(2)実際はループになっており2回目以降の変数名を変えるのは不可能 ということで、現在は(3)の対処をしています。 Q1.何故こういう現象が起こるのか Q2.デストラクタ宣言の有無で変わるのは何故か Q3.どういう対処が正しいのか 実際の処理は、こんな感じです。 foreach($aaa as $x) { $bar=&new Foo($x); if( $bar->test() ) $value[]=&$bar; /*ここに else unset($bar); を入れるとOK */ }
- みんなの回答 (3)
- 専門家の回答
お礼
直接の回答は得られませんでしたが、strictにすると警告が出ることを教えていただきありがとうございました。