参照とエイリアスは異なるメカニズムです 著者: zkarakaya 日付 14/03/2001 エイリアスと参照は、PHP ではまったく異なるメカニズムです。 Java または C++ プログラマーの場合、実行時に作成されたオブジェクトを使用するときは注意が必要です。
例を見てみましょう。
class MyClass{ var $myData; var $outManager; cfunction MyClass($p){ $this->myData=$p; $this->outManager = 新しい MyOutManager($this); cfunction display(){ $this->outManager->display(); }クラス MyOutManager{ var $refObj; cfunction MyOutManager(&$obj){ $this->refObj = &$obj; cfunction display(){ echo $this->refObj->myData; $myvar = 新しい MyClass(10); $myvar->myData = 20; $myvar->display(); ?>
このプログラムコードの出力はどのような値になりますか。多くのプログラマは「20」と答えるでしょうが、これは正しくありません。出力は 10 です。なぜですか?代入演算子の右側に MyClass 型のインスタンスを作成し、初期値 10 を与えているためです。MyClass のコンストラクターで、その新しく作成されたインスタンスのメモリ位置を MyOutManager 型の別のオブジェクトに送信しています。この値を $refObj に保持します。このオブジェクトの参照カウントは 1 になり、これは outManager インスタンスの $refObf プロパティです。実行を続けましょう。コンストラクターはジョブを終了し、代入演算子に戻りました。 PHP4 は、新しく作成されたオブジェクトに対して $myvar という名前の新しい参照を作成するようになりました。現在、そのオブジェクトの参照カウントは 2 です。$myvar がエイリアスではないことに注意してください。そのため、$myData という名前のプロパティに値 20 を割り当てる次のステートメントを実行すると、PHP4 は MyClass 型の新しいインスタンスを作成し、そのメンバーの outManager によっても参照される古いインスタンスの内容をコピーします。そして、myData の内容を 20 に変更します。