[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"; // 結果は ???
?>

この場合、参照はシンボリックリンクのようなもので、
シンボリックリンクのコピーはシンボリックリンクなのだから、
期待された動作である、という結論だったのですが、
直感的ではないですよね。(そう思うのは私だけでしょうか…)