PHPのどうしようもなくくだらないテスト2 参照とコピー

これ、前にも書いたような気がするけど、まあいいや。忘れたし。参照とかコピーとか参照返しとかそんなんの確認。


$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でポインタを引数に渡すときに勘違いするなよと同じ話かな?

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: PHP パーマリンク

コメントを残す

メールアドレスが公開されることはありません。