フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援
フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援

Laradock開発環境構築

はじめに

PHPに慣れた人ならばなんだ、そんな事かと思うくらいには有名な罠だが、まんまとはまったので個人の備忘録程度にメモ

同じような記事がごろごろあるあれです。

問題のコード

<?php

$ar = [1, 2, 3];
foreach($ar as &$elm)
{}

foreach($ar as $elm)
{}

print_r($ar);

特に何かしたわけでもないがforeachを1回目は参照渡しで2回目はコピーで使用している。
この出力は以下である。

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(2)
}

チーン

原因

ブロックスコープがないphpでは1回目のforeachで宣言した$elmがループを抜けた後も生きており、配列の最後の要素の参照をもったままになっている。

そのため2回目のforeachでは

// $elmは$ar[2]を指しているので
$ar[2] = $ar[0]; // 1
$ar[2] = $ar[1]; // 2
$ar[2] = $ar[2]; // 2

といった挙動が発生してしまう。

対策

個人的には少しダサいと感じるがちゃんとunset

<?php

$ar = [1, 2, 3];
foreach($ar as &$elm)
{}
unset($elm);

foreach($ar as $elm)
{}

var_dump($ar);

出力

array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
}

初心者の僕みたいな人は、例外などなくunsetを必ずする癖をつけたほうがよさそうだ

まとめ

foreachで参照渡しした時、unsetを必ずしよう。

参考

php.net/manual/ja/control-structures.foreach.php

[紹介元] PHPタグが付けられた新着投稿 – Qiita Laradock開発環境構築

コメント

記事に戻る

コメントを残す