参照変数に関する注意点
2008年10月30日
関数で参照を返す
関数の戻り値を参照にする事もできます。関数名の前に&を付けて、戻り値が参照である事を明示しておきます。返ってきた参照を代入する時も同様に&を付けます。この場合、どちらの&が欠けても参照渡しにはなりません。
PHP
- function & toRef(&$val) {
- return $val;
- }
- // 参照渡し
- $val = 'BEFORE';
- $ref =& toRef($val);
- $ref = 'AFTER';
- print $val;// AFTER
- // コピー渡し
- $val = 'BEFORE';
- $notref = toRef($val);
- $notref = 'AFTER';
- print $val;// BEFORE
関数に参照を渡したい時は、必ず定義する時に&を付けておく必要があります。
引数に&をつけて関数を呼ぶ方法は、今後廃止される予定です。
PHP
- // 正
- function func(&$arg) {}
- func($arg);
- // 誤
- function func($arg) {}
- func(&$arg);
インスタンス生成時の注意点
PHP4でコンストラクタ定義で&を付ける必要はありません。ただし、インスタンス生成時にnewがコピーを返すので注意が必要です。
PHP
- class Test {
- var $value = 'foo';
- function Test() {
- $GLOBALS['test'] =& $this;
- }
- function set($value) {
- $this->value = $value;
- }
- function display() {
- echo '<br />' . $this->value;
- }
- }
- $obj = new Test();
- $obj->set('bar');
- $obj->display(); // bar
- $test->display();// foo
- $obj =& new Test();
- $obj->set('bar');
- $obj->display(); // bar
- $test->display();// bar
インスタンスの代入
PHP5からインスタンスの扱いはJAVA同様に参照となります。
PHP
- $obj =& new Class();
- // PHP4
- $ref_obj =& $obj;// 2つは同じ
- $copy_obj = $obj;// 2つは独立
- // PHP5
- $ref_obj = $obj;// 2つは同じ
- $copy_obj = clone $obj;// 2つは独立







