読者です 読者をやめる 読者になる 読者になる

PHPの参照が使いにくい件について

PHP

最近PHPを使っていて「むきー」となったこと。
単純化すると、配列に入っているオブジェクトを舐めて、
条件を満たすものを取り出してそれを後で変更したい、みたいなコードを書く。
とりだしたもののオブジェクトの状態を変更。
で、大本の配列を回してみたら中身かわってねえ……。
要するにPHPの参照の挙動なんですが、
なんでこんなことに。
勿論、PHPの参照を意味する&をつければこの動作はできるんですが、
付け忘れただけで変更した筈のオブジェクトが変更されないことに。
めんどくせー。参照にはforeachの$valueを参照で受けると思わぬバグを引き起こす - ぱせらんメモこんな罠もあるし、何とかならんかねー。

変数が変更されない版
変数が変更される版
Pythonで期待する挙動を書いた場合
デフォでPythonみたいになってくれよー。

<?php
$hoge_list = array(
    array('Hoge'=>array('value'=>100)),
    array('Hoge'=>array('value'=>101)),
    array('Hoge'=>array('value'=>102)),
    array('Hoge'=>array('value'=>103)),
    array('Hoge'=>array('value'=>104)),
);

echo "----- Before -----\n";

$select_hoge = null;
foreach ($hoge_list as &$hoge) {
    echo $hoge['Hoge']['value']."\n";
    if ($hoge['Hoge']['value'] == 100) {
        //$hoge['Hoge']['value'] = 999;
        $select_hoge = &$hoge; // &を忘れてはいけない!
    }
}

$select_hoge['Hoge']['value'] = 999;

echo "----- After -----\n";

foreach ($hoge_list as $hoge) {
    echo $hoge['Hoge']['value']."\n";
}

?>