プログラミング入門 PHPで参照渡しする際の注意

参照渡しを使う際は要注意

以下のコードをご覧ください。

<?php
$myArr = ['apple', 'orange', 'bana'];

function hoge(&$arr, $fruit){
    foreach ($arr as &$item){
        if($item == $fruit){
            $item = $fruit . ' match';
        }
    }
    $item = 'end';
    array_push($arr,$item);
}

hoge($myArr, 'orange');
print_r($myArr);
?>

このコードでは二つ参照渡しを使っています。ひとつは&$arrで、もうひとつは&$itemです。

実はこのコードにはバグがあります。

上記のprint_rの結果は以下になり、配列の最後の要素が上書きされてしまっています。

Array
(
    [0] => apple
    [1] => orange match
    [2] => end
    [3] => end
)

$itemは参照渡しなので、foreach文によって配列の最後の要素が$itemに入った状態で、$item = 'end’ が実行されるので、上書きされてしまっているというわけです

for文で参照渡しした際は、その後にunsetをするようにしましょう。

<?php
$myArr = ['apple', 'orange', 'bana'];

function hoge(&$arr, $fruit){
    foreach ($arr as &$item){
        if($item == $fruit){
            $item = $fruit . ' match';
        }
    }
    unset($item);
    $item = 'end';
    array_push($arr,$item);
}

hoge($myArr, 'orange');
print_r($myArr);
?>