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

N.Yoshioka php-users@php.gr.jp
Sat, 15 Mar 2003 04:56:59 +0900


吉岡です。
小泉さんご意見ありがとうございました。

過去のメーリングリストの書庫の中でarray_mapに参照渡しの関数を使用している
例を見たので使えるかな?と思ったのですが、やはり無理なようです。
私の狙いとしては、

<?php
function abc(&$aa) {
    if($aa > 2) {
        $aa = 2;
        return(0);
    } else {
        return(1);
    }
}

$a = array(1,2,3,4,5);
$d = $a;
// $a[0] = $a[0]; これで狙い通り
$result = array_map("abc", $d);
?>

と、関数の返り値に更新されたかどうかのフラグの配列を返すようにしたかった
のですが、他の方法でやってみます。

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

確かにバグっぽいですよね。
上記のコードでも $d = $a の後に $a[0] = $a[0] というように一度コピー元の
変数を使用すると正常(に見える)動作をするようです。

しかしコピーしたはずの変数が何世代にもわたって書き換えられるのはかなり
怖いですよね。
以後気をつけます。
ありがとうございました。