これ、前にも書いたような気がするけど、まあいいや。忘れたし。参照とかコピーとか参照返しとかそんなんの確認。
$glob = "aaa";
function & toRef(&$val) {
return $val;
}
function change(&$val) {
global $glob;
$val =& $glob; // 参照先を変えようとしている
echo $val . "\n"; // ③
}
class RefArray {
var $array;
function RefArray(&$array) {
$this->array =& $array;
$this->array[0] = 1; // 参照先の値を変えようとしている
}
function out() {
echo $this->array[0] . "\n";
}
}
// 参照渡し
$val = 1;
$ref =& toRef($val);
$ref += 1;
print $val . "\n";// ①
// コピー渡し
$val_2 = 1;
$notref = toRef($val_2); // ここがコピーなので下の変更は$val_2には無効
$notref += 1;
print $val_2 . "\n";// ②
// 変更
$val_3 = "bbb";
change($val_3); // 参照先は変えられない
echo $val_3 . "\n"; // ④
// 配列
$val_4 = array(0, 1);
echo "\n" . $val_4[0] . "\n"; // ⑤
$val_5 = new RefArray($val_4); // 参照先の値は変えられる
$val_5->out(); // ⑥
echo $val_4[0] . "\n"; // ⑦
php5.2.4の結果。
2 // ①
1 // ②
aaa // ③
bbb // ④
0 // ⑤
1 // ⑥
1 // ⑦
参照で返したら参照代入しないといけないというのと、関数の引数の参照先は変えられないという話(だと思う)。
参照先が変えられないというのは、Cでポインタを引数に渡すときに勘違いするなよと同じ話かな?
以上