いしなお!
2005-09-08 [長年日記]
_ [PHP][リファレンス] リファレンスをよく分かっていなかった (10:02)
$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のすべてが同じシンボルテーブルを参照するようになるんだと勘違いしていた。やっぱりわかってないなー。
_ [PHP][リファレンス] やっぱりダメだった (11:39)
リファレンス変数の動作イメージがきちんと理解できていないな。配列と絡むとさらに混乱度倍。
要は、
function &getNode(&$tree, $path)
{
$node =& $tree;
foreach (explode('/', $path) as $key) {
if ($key == '') {continue;}
if (!isset($node[$key])) {
$node[$key] = NULL;
}
$node =& $node[$key];
}
return $node;
}
function setNode(&$tree, $path, $value)
{
$node =& getNode($tree, $path);
$node = $value;
}
function setNodeByRef(&$tree, $path, &$value)
{
$node =& getNode($tree, $path);
$node =& $value;
}
$tree = array(
1 => array(
11 => 11,
12 => 12,
),
2 => array(
21 => 21
),
);
$a = 'a';
print_r($tree);
setNode($tree, '1/11', $a);
print_r($tree);
setNodeByRef($tree, '1/12', $a);
print_r($tree);
$a = 'A';
print_r($tree);
なんてことをしたかったんだけど、これだとsetNodeByRefしても、指定したノードに$aのリファレンスが代入されない。
function setNodeByRef(&$tree, $path, &$value)
{
$node =& $tree;
$keys = explode('/', $path);
$lastkey = array_pop($keys);
foreach ($keys as $key) {
if ($key == '') {continue;}
if (!isset($node[$key])) {
$node[$key] = NULL;
}
$node =& $node[$key];
}
$node[$lastkey] =& $value;
}
みたいにすれば大丈夫だけど。
_ [日常][スポクラ] 今日のスポクラ (16:19)
朝からPHPのリファレンスのテストをごちゃごちゃやっていたら、スポクラに行くのが10分ほど遅れてしまった。んで、マシンは今日は7割程度に省略。昨日今日とやたら汗をかくのはやっぱりVAAM缶のせいかな。それとも気候か体質の問題?
_ [iTunes][QuickTime] なんじゃこりゃ (17:07)
iTunes 5にアップデートしようとしたら、QuickTimeを7にアップデートしてもいいか聞いてきた。俺はQuickTime 6のProライセンスを持っているので、それが使えなくなるのはいやだから、「いいえ」を選択した。すると、インストールを中止するか聞いてきたので、QuickTimeのアップデートはしたくないけど、iTunesのインストールはしたかったので、「いいえ」を選択した。するとふつうにiTunesのセットアッププログラムが立ち上がったので、そのままインストール作業を続行した。すると、先ほど拒否したはずのQuickTimeも含めてインストールが行われ、QuickTimeはバージョン7にアップグレードされ、俺のQuickTime 6 Proのライセンスは失われた。なんじゃそりゃ。これってダウングレードできるのかなー。
一番最後の結果、最後から2番目のパターンと続けるとzzzになりますが、単独で実行するとxzzになりますよ。<br>その前のパターンの「$x =& $y;」を引きずってるんじゃないでしょうか。