参照とエイリアスは異なるメカニズムです
著者: zkarakaya
日付 2001/14/03
エイリアスと参照は、PHP ではまったく異なるメカニズムです。
Java または C++ プログラマーの場合、実行時に作成された
オブジェクトを使用するときに注意する必要があります。
例を見てみましょう。
クラス MyClass{
var $myData;
var $outManager;
cfunction MyClass($p){
$this->myData=$p;
$this->outManager = new 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 は alies ではないことに注意してください。そのため、
$myData という名前のプロパティに値 20 を割り当てる次のステートメントを実行すると、PHP4 は MyClass 型の新しいインスタンスを作成し、そのメンバーの outManager によっても参照される古いインスタンスの内容を
コピーします。
そして、myData の内容を 20 に変更します。
>これ以降、MyClass タイプの 2 つの異なるインスタンスを持つことになります。
私たちの意図はこれではありませんでした。したがって、この問題を修正するには、オブジェクト作成ステートメントでエイリアス
を使用します。つまり、 use; です。
$myvar = &new MyClass(10);
これで問題は解決します。したがって、C++ および Java プログラマーの場合は、
PHP コードを記述する際に注意する必要があります。
この説明は、
に記載されている情報と矛盾しません。 PHP 4: リファレンス
カウントとエイリアス
執筆者: Andi
Gutmans。
ジヤ・カラカヤ