PHPのforeachループつかって配列の中身をいじりたいときに、参照渡しでこんなコード書いてハマりました
foreach($list as &$row){
if (!file_exist(FILEPATH . $row['filename'])){
$row['filename'] = newfile();
}
}
参照渡しつかうことで $row を書き換えるだけで $list を更新できて便利だと思って使ってたんですが…
このサンプルコードだと、このあとで$rowを変更するとハマります。
foreach($list as &$row){
if (!file_exist(FILEPATH . $row['filename'])){
$row['filename'] = newfile();
}
}
// あれこれいろんな処理
$row = [];
こんな風になってると $row = []
した瞬間に $list
の最後の要素まで書き換わります。
なんとなく、このサンプルでは $row
がforeachブロック内だけで有効なローカル変数のように感じるんですが、実際にはforeachブロックから外れても有効な変数なので、こういうことが発生するんですね。
やっぱり参照渡しって気づかぬうちに意図せず書き換えるコードを作り込んでしまう要因になりやすい気がします。
ってことで、ちょっと不格好な気もするけど↓の方がいいかなって思いました。
foreach($list as $key => $row){
if (!file_exist(FILEPATH . $row['filename'])){
$list[$key]['filename'] = newfile();
}
}