ホームページ >php教程 >php手册 >参照とエイリアスは異なるメカニズムです (zkarakaya )

参照とエイリアスは異なるメカニズムです (zkarakaya )

WBOY
WBOYオリジナル
2016-06-21 09:10:321032ブラウズ

参照とエイリアスは異なるメカニズムです
著者: 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。


ジヤ・カラカヤ





声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。