日記
リファレンスをよく分かっていなかった (10:02)Edit

$x = 'x';
$tmp =& $x;
$tmp = 'X';
echo 'x = ' . $x . "\n";
echo 'tmp = ' . $tmp . "\n";
$x = 'x';
$tmp =& $x;
unset($tmp);
$tmp = 'X';
echo 'x = ' . $x . "\n";
echo 'tmp = ' . $tmp . "\n";
$x = 'x';
$y = 'y';
$tmp =& $x;
$tmp =& $y;
$tmp = 'z';
echo 'x = ' . $x . "\n";
echo 'y = ' . $y . "\n";
echo 'tmp = ' . $tmp . "\n";
$x = 'x';
$y = 'y';
$tmp =& $x;
$x =& $y;
$tmp = 'z';
echo 'x = ' . $x . "\n";
echo 'y = ' . $y . "\n";
echo 'tmp = ' . $tmp . "\n";

の結果を正しく理解していなかった模様。この辺の理解が曖昧なままに、配列の要素のリファレンスをいじっていて混乱してしまった。

ああ、肝心なパターンが抜けていた

$x = 'x';
$y = 'y';
$tmp =& $x;
$tmp =& $y;
$tmp = 'z';
echo 'x = ' . $x . "\n";
echo 'y = ' . $y . "\n";
echo 'tmp = ' . $tmp . "\n";

ね。リファレンス変数にリファレンスを代入した場合の影響範囲。 ちなみに上記の結果は、

x = z
y = z
tmp = z

になる。

すみません、間違いでした

ISAさんにコメントで指摘された通り、前のテストコードで設定したリファレンスを引きずっちゃってました。正しくは、

x = x
y = z
tmp = z

でした。

$tmp =& $x;
$tmp =& $y;

で、$x、$y、$tmpのすべてが同じシンボルテーブルを参照するようになるんだと勘違いしていた。やっぱりわかってないなー。

Published At2005-09-08 00:00Updated At2005-09-08 00:00