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

ISIGE, Akira xia @ silvia.com
2004年 2月 2日 (月) 21:01:42 JST


いしげ です.

On 2004/02/02 20:02:53 JST,
"奥村" <okuran_php_ml @ hotmail.com> wrote:

> Class test {
>     var $Val;
>     Function setVal ($pVal) {
>         $this->Val = $pVal;
>     }
>     Function getVal () {
>         Return $this->Val;
>     }
> }
> $ObjTest = new test();
> 
> $ObjTest->setVal("aaa");
> $Val =& $ObjTest->getVal();
> 
> $ObjTestCopy = $ObjTest;
> $ObjTestCopy->setVal("bbb");
> 
> Echo $Val;
> マニュアルにもあるように「$ObjTestCopy = $ObjTest;」では
> コピーが生成されるはずなので「aaa」が返ってくると思っていたのですが、
> 「bbb」が返ってくるのでビックリしています。
> この動作は正しいのでしょうか?


興味を持ったので手元の Windows 版 4.3.3 で実験してみたところ,
同様の結果になりました.

途中の $Val に代入するところで,=& でなく = を使用すると,
完全に期待通りの動作になります.

順序を変えて,$Val への代入を $ObjTestCopy = $ObjTest の後に行なうと,
これまた期待通りの動作になりました.


getVal() が & 付きで定義されていないので,
その戻り値を =& で代入しても = で代入しても動作は同じではないかと
思ったのですが,内部的には異なるのでしょうか……

試しに getVal() を & 付き宣言にして $Val とリファレンスで結合するような
コードにしてみましたが,結果は同じでした.

マニュアルには & 付きでない宣言の関数の帰り値を =& で結合しようとした場合の
挙動については載っていないようですが……いわゆる「不定」でしょうか :-)


--
ISIGE, Akira



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