【PHP】変数の参照
PHPの変数の参照について詳しく解説
変数の参照とは?
PHPにおける変数の参照とは、同じ値を異なる名前の変数で共有できる仕組みのことです。通常の代入は値をコピーしますが、参照を使用すると変数は同じメモリ領域を指します。
$a = 10;
$b = &$a; // $bは$aの参照を持つ
echo $b; // 10
$a = 20;
echo $b; // 20
このように、参照を使うと、片方の変数の値を変更すると、もう片方の値も変わります。
参照による代入
PHPでは「&」を使うことで参照による代入が可能です。
$x = 100;
$y = &$x;
$y = 200;
echo $x; // 200
通常の代入($y = $x;
)では値のコピーが行われますが、「&」をつけると同じ値を共有します。
関数での参照渡し
関数の引数を参照渡しにすることで、関数の中で変更した値を元の変数に反映させることができます。
function increment(&$num) {
$num++;
}
$a = 5;
increment($a);
echo $a; // 6
通常の値渡しでは関数内の変更は外に影響を与えませんが、参照渡しでは関数内の変更が呼び出し元の変数にも適用されます。
関数の戻り値としての参照
関数の戻り値を参照にすると、関数の外で変数を変更することができます。
function &getValue() {
static $val = 10;
return $val;
}
$ref = &getValue();
$ref = 30;
echo getValue(); // 30
このように、戻り値の参照を使うと関数が保持している変数の値を直接変更できます。
参照の解除とunsetの影響
unset()
を使うと参照を解除できます。ただし、変数そのものは削除されません。
$a = 50;
$b = &$a;
unset($b);
echo $a; // 50
unset($b)
すると$b
は削除されますが、$a
は残ります。
グローバル変数と参照
関数内でグローバル変数を参照するときに「global」ではなく「&」を使うこともできます。
$var = 100;
function test() {
global $var;
$var = 200;
}
test();
echo $var; // 200
また、「$GLOBALS」を使用するとより明示的に参照ができます。
$val = 10;
function changeValue() {
$GLOBALS['val'] = 20;
}
changeValue();
echo $val; // 20
foreachと参照
foreach
を使う際に参照を利用すると、ループ内で値を変更すると元の配列にも反映されます。
$arr = [1, 2, 3];
foreach ($arr as &$value) {
$value *= 2;
}
unset($value); // 参照を解除しないと意図しない動作になる可能性がある
print_r($arr);
// [2, 4, 6]
注意点として、最後にunset($value)
をしないと、次に使用される変数が意図しない参照になってしまうことがあります。
まとめ
- 「&」を使うと変数の参照ができる
- 関数の引数や戻り値に参照を使うと値を直接変更できる
- unset()は参照を解除できるが元の変数は消えない
- foreachで参照を使う際は最後に
unset()
を忘れない
PHPの参照を適切に使うことで、メモリ効率の向上や柔軟なコードが書けますが、意図しない動作を避けるために注意が必要です。