Skip to content

ReferenceReusedFromConfusingScope

混乱を招く可能性のあるスコープで割り当てられた参照が後で再利用される場合に発生します。 PHPは他のほとんどの言語と同じようにループやifをスコープしないため、よくある問題は、そのようなスコープで宣言された変数の再利用です。通常、すでに定義された変数への再代入は単に再代入するだけなので問題ありませんが、すでに定義された変数が参照である場合、参照先の変数の値を変更します。

<?php
$arr = [1, 2, 3];
foreach ($arr as &$i) {
    ++$i;
}
// ...参照としての$iの使用が忘れられた後のコード
for ($i = 0; $i < 10; ++$i) {
    echo $i;
}
// $arrは期待される[2, 3, 4]ではなく[2, 3, 10]になります

この問題を修正するには、そのようなスコープで使用した後に参照を解除します:

<?php
$arr = [1, 2, 3];
foreach ($arr as &$i) {
    ++$i;
}
unset($i);
for ($i = 0; $i < 10; ++$i) {
    echo $i;
}
// $arrは正しく[2, 3, 4]になります

ユーザーノート