参照変数に関する注意点

関数で参照を返す

関数の戻り値を参照にする事もできます。関数名の前に&を付けて、戻り値が参照である事を明示しておきます。返ってきた参照を代入する時も同様に&を付けます。この場合、どちらの&が欠けても参照渡しにはなりません。

PHP

  1. function & toRef(&$val) {
  2.   return $val;
  3. }
  4. // 参照渡し
  5. $val = 'BEFORE';
  6. $ref =& toRef($val);
  7. $ref = 'AFTER';
  8. print $val;// AFTER
  9. // コピー渡し
  10. $val = 'BEFORE';
  11. $notref = toRef($val);
  12. $notref = 'AFTER';
  13. print $val;// BEFORE

関数に参照を渡したい時は、必ず定義する時に&を付けておく必要があります。
引数に&をつけて関数を呼ぶ方法は、今後廃止される予定です。

PHP

  1. // 正
  2. function func(&$arg) {}
  3. func($arg);
  4. // 誤
  5. function func($arg) {}
  6. func(&$arg);

インスタンス生成時の注意点

PHP4でコンストラクタ定義で&を付ける必要はありません。ただし、インスタンス生成時にnewがコピーを返すので注意が必要です。

PHP

  1. class Test {
  2.   var $value = 'foo';
  3.   function Test() {
  4.     $GLOBALS['test'] =& $this;
  5.   }
  6.   function set($value) {
  7.     $this->value = $value;
  8.   }
  9.   function display() {
  10.     echo '<br />' . $this->value;
  11.   }
  12. }
  13. $obj = new Test();
  14. $obj->set('bar');
  15. $obj->display(); // bar
  16. $test->display();// foo
  17. $obj =& new Test();
  18. $obj->set('bar');
  19. $obj->display(); // bar
  20. $test->display();// bar

インスタンスの代入

PHP5からインスタンスの扱いはJAVA同様に参照となります。

PHP

  1. $obj =& new Class();
  2. // PHP4
  3. $ref_obj =& $obj;// 2つは同じ
  4. $copy_obj = $obj;// 2つは独立
  5. // PHP5
  6. $ref_obj = $obj;// 2つは同じ
  7. $copy_obj = clone $obj;// 2つは独立

参考資料

コメントは受け付けていません。