参照渡し 【12日目】
今回はPHPにおける「参照渡し」についてまとめてみたいと思います。
概要
&$変数と書くことで、「参照渡し」または「参照」と呼ばれる概念を表します。
これは変数の値ではなく、その変数への参照を渡すことを意味します。通常の変数の代入は「値渡し」であるため、値のコピーが作られますが、参照を渡すことで同じ変数を共有することができます。
以下は、参照渡しの基本的な例です。
$a = 10;
$b = &$a; // 変数bに変数aの参照を代入
$b = 20; // 変数bを変更すると、変数aも変更される
echo $a; // 20
echo $b; // 20
この例では、$aと$bは同じメモリ位置(データが格納されるアドレス)を指しています。したがって、どちらかの変数を変更するともう一方も変更されます。
関数における参照渡し
通常、関数内で変数を書き換えても呼び出し元の環境に反映されることはありませんが、関数の引数に&$変数と記述することで、関数内で変更した変数が呼び出し元にも適用されます。
function addTen(&$num) {
$num += 10;
}
$value = 5;
addTen($value);
echo $value; // 15
このように便利に利用できる反面、無用な参照渡しはエラーやバグを招く原因にもなるため、使用には注意が必要です。
関数内でunset()を使う
関数内で参照渡しを終了するにはunsetを使うことで、変数への参照が解除されます。
因みに、変数が関数内でunsetされた場合、 ローカル変数のみが破棄され、呼出側の環境(グローバル環境など)ではその値を保持します。
function removeReference(&$ref) { unset($ref); $ref += 10; // 変数が破棄されたため、エラーが発生する } $var = 42; removeReference($var); echo // 42
foreachループにおける参照渡し
デフォルトでは配列の要素が「値渡し」されますが、foreach($array as &$変数)のようにすることで、要素への参照を取得できます。
$numbers = [1, 2, 3, 4];
foreach ($numbers as &$value) {
$value *= 2;
}
print_r($numbers); // Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
主な使用場面
参照渡しは主に、大きなデータ構造やオブジェクトを扱う際のメモリ効率の向上を目的に利用されます。
ただし、慎重に使用しないとコードが複雑になり、バグが発生する可能性が高まるので、基本的な小さなデータに対しては、「通常の値渡し」を使用する方がシンプルで安全です。
以上です。
参考文献
https://php.net/manual/ja/function.unset.php