先にまとめ。
実体はこの辺か。
変数のアドレスとるだけと思いきやだいぶ処理してるし、全然意味わからん…。
ところで、PHPリファレンス:リファレンス解除(ややこしい)を読むと何か変な気がしてきたので、元記事コードを改変してみる。
/cygdrive/c/xampp/php/php.exe -r '$v = 1;$ref = &$v;var_dump( $ref );' int(1)
Oh...
困ったときはマニュアルを参照。var_dumpの定義。PHPリファレンスにあるリファレンス渡しではない。値渡し(デフォルト)で呼び出すので&string("b")とかそんな表示には、なりゃしやんせん。
いやほんと、PHPは糞みんなもっとマニュアルと本体コード読んだらいいと思うよ。
配列の要素のリファレンスは仕様。(配列内のリファレンスの挙動はその要素ごとに決まる)
だそう。PHP 5 以降では、配列を参照渡しすることでその値を直接変更できるようになりました
の例で、値の要素の参照を取得したあとはunsetしろって書いてあるから、そういう使い方を想定してるんじゃないですかね。
/cygdrive/c/xampp/php/php.exe -r '$array = array(1,2,3);$ref = &$array[1];unset($ref);var_dump($array);' array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }
しかし逆もありなのね。これは動作として違和感ないけど、何に使うのだろうか。
/cygdrive/c/xampp/php/php.exe -r '$array = array(1,2,3);$x="aaa";$array[1] = &$x;var_dump($array);' array(3) { [0]=> int(1) [1]=> &string(3) "aaa" [2]=> int(3) }
<< なかだ [具体的にはどのようにできないんでしょうか。 それと、cygwinとgccのバージョンはいくつですか?]
<< kuwa1 [~/rubysrc/ruby-1.8.6-p114 $ make gcc -g -O2 -DRUBY_EXP..]
<< なかだ [なるほど、1.8.6と1.8.5ブランチでしたか。 確かにr14223とr14224はバックポートする必要があります..]