[PHP-users 13916] Re: array_map関数に参照渡しの関数を適用するときの挙動について

Moriyoshi Koizumi php-users@php.gr.jp
Wed, 12 Mar 2003 22:33:33 +0900


小泉です。

"N.Yoshioka" <noyo@pop16.odn.ne.jp> wrote:

> <?php
> function abc(&$aa) {
>  $aa = 2;
> }
> 
> $a = array(1,2,3,4,5);
> $b = $a;
> $c = $b;
> $d = $c;
> 
> array_map("abc", $d);
> print_r($a);
> print_r($b);
> print_r($c);
> print_r($d);
> ?>
> 
> 上記のようなソースを実行すると、配列 $a のコピーをとっているにもかかわらず、
> すべての変数が書き換えられてしまいます。($a $b $c $d すべて2になってしまう
> !)

array_map() の本来の利用法はご存知だとは思いますが、

$a = array(1,2,3,4,5);
$result = array_map('abc', $a);

こうですよね。

> 同様の関数のarray_walkを使用するとこの現象は起こりません。
> これはarray_map関数の仕様なのでしょうか?
> array_map関数に適用する関数は参照渡しを使用してはいけないのでしょうか?

うーん、バグなのかもしれませんが、前例を見る限り直される見込みはおそらく
ありません。本来の使い方から外れている動作は未定義ですから。
つまり、「参照渡しを使用してはいけない」ということです。