[PHP-users 14013] Re: array_map関数に参照渡しの関数を適用するときの挙動について
Moriyoshi Koizumi
php-users@php.gr.jp
Sun, 16 Mar 2003 00:12:55 +0900
小泉です。
レス遅くなりましたが、
"N.Yoshioka" <noyo@pop16.odn.ne.jp> wrote:
> > うーん、バグなのかもしれませんが、前例を見る限り直される見込みはおそらく
> > ありません。本来の使い方から外れている動作は未定義ですから。
>
> 確かにバグっぽいですよね。
> 上記のコードでも $d = $a の後に $a[0] = $a[0] というように一度コピー元の
> 変数を使用すると正常(に見える)動作をするようです。
>
> しかしコピーしたはずの変数が何世代にもわたって書き換えられるのはかなり
> 怖いですよね。
> 以後気をつけます。
> ありがとうございました。
じつは array_walk() でも、参照でコールバック関数に引数を渡せないというバグ
があったりするのですが (渡せないことはないのですが、
allow_call_time_pass_by_reference を有効にする必要がある)、
これもエンジンの仕様上直せなさそうです。
また、次のような事例も php-dev での議論の結果、結局バグとして扱われなかっ
た経緯があります。
<?php
function hoge_func($hoge) {
$hoge[0] = '???';
}
$hoge = 'abc';
$a = array();
$a[0] = &$hoge;
$b = $a; // ここで配列の内容はコピーされるはずなのに…
hoge_func($b);
echo $a[0],"\n"; // 結果は ???
?>
この場合、参照はシンボリックリンクのようなもので、
シンボリックリンクのコピーはシンボリックリンクなのだから、
期待された動作である、という結論だったのですが、
直感的ではないですよね。(そう思うのは私だけでしょうか…)