トップ «前の日記(2005-09-07) 最新 次の日記(2005-09-09)» 編集

いしなお!

2002|01|02|03|04|05|06|07|08|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|02|03|04|07|
2009|03|

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のライセンスは失われた。なんじゃそりゃ。これってダウングレードできるのかなー。

_ [W21S] ジョグダイアルが完全に死んだ (19:07)

何をやってもびた一文反応しなくなってしまった。今のところ、今週末にW31CAに買い換える予定。Suica初代機に乗り換えるのはあきらめた。

本日のツッコミ(全1件) [ツッコミを入れる]
_ ISA (2005-09-08 12:29)

一番最後の結果、最後から2番目のパターンと続けるとzzzになりますが、単独で実行するとxzzになりますよ。<br>その前のパターンの「$x =& $y;」を引きずってるんじゃないでしょうか。

[]