[PHP-users 20198]Re: コピーせずにリファレンス渡しになる

T.Okabe okabe @ nsd.jip.co.jp
2004年 2月 2日 (月) 20:45:17 JST


岡部といいます。

実は私もリファレンスに対する理解を間違えていましたが、
マニュアルをちゃんと読むと下記のように書いてあります。

http://www.php.net/manual/ja/language.references.php
PHPにおいてリファレンスは、同じ変数の内容を異なった名前で
コールすることを意味します。これはCポインタのようなものでは
なく、シンボル テーブルのエイリアスです。
<省略>
リファレンスは、UNIXファイルシステ ムのハードリンクのようなもの
であると考えられます。

http://www.php.net/manual/ja/language.references.whatdo.php
<?php
$a =& $b
?>
この場合、$aと$bは同じ変数を指します。
注意: ここで、$aと$bは完全に同じで、$aが$bを指しているわけでは
なく、その逆でもありません。$aと$bは同じ場所を指しているのです。 


なお、以下はテストしてみた結果です。

>$ObjTest = new test();
>
>$ObjTest->setVal("aaa");
>$Val =& $ObjTest->getVal();

ここまでの状態で、
var_dump($ObjTest);
を見ると、

object(test)(1) {
  ["Val"]=>
  &string(3) "aaa"
}

というように、オブジェクト変数のValの型に
'&string' と、'&' が付いています。

ちなみに、同じ要領で
var_dump($Val);
を見ると、'&' は付いていません。

従って、$ObjTest を $ObjTestCopy にコピーすると、
$ObjTestCopy->Val も '&' が付いた状態になります。

試しに、
$ObjTestCopy->setVal("bbb");
の代わりに、
$ObjTest->setVal("bbb");
$Val = "bbb";
とやっても、$ObjTest->Val と $ObjTestCopy->Val と $Val の
3つとも'bbb'となります。


PHP-users メーリングリストの案内