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"; } ?>