PHP7.4.1における関数の値渡しとリファレンス渡し(参照渡し)について。
//①値渡し
$a = ['あ', 'い', 'う', 'え', 'お'];
$a1 = count($a);
foreach ($a as $av) {
echo $av, "\n"; //count関数は値渡しなので$bは変化なし
}
echo "{$a1}\n"; //5
//②リファレンス渡し(参照渡し)
$b = ['あ', 'い', 'う', 'え', 'お'];
array_shift($b);
foreach ($b as $b1) {
echo $b1, "\n"; //返り値を受けていないのに$bが置き換わっている
}
//③リファレンス渡し(参照渡し)のユーザー定義関数
function ccc(&$c1) { //パラメータの先頭に&を付けると参照渡しになる
$i = 0; //配列のインデックス用の変数
foreach ($c1 as $cv) {
$c1[$i] = $cv. ' ☆ '. "\n"; //$cvの値に☆を付けて再代入
$i++; //$iのインデックス用の更新処理
}
}
$c = ['あ', 'い', 'う', 'え', 'お'];
$d = ccc($c); //ccc関数は参照渡しなので返り値が存在しない
foreach ($c as $cv) {
echo $cv; //あ ☆い ☆う ☆ え ☆お ☆
}
foreach ($d as $cv) {
echo $cv; //$dに値が存在しない
}
値渡しとは、通常の関数に渡すパラメータのことです。
リファレンス渡し(参照渡し)とは、値渡しではない関数に渡すパラメータのことです。
値渡しの関数には返り値があります。
値渡しの関数では、パラメータに指定した変数の値は汚されません。
ここで言う汚されないの意味は、関数の処理結果がパラメータに指定した変数に自動で再代入されない、という意味です。
リファレンス渡しの関数には返り値はありません。
リファレンス渡しの関数では、パラメータに指定した変数の値は汚されてしまいます。
上記①のスクリプトでは、$aをcount関数で処理しています。
しかしcount関数は値渡しの関数なので、返り値を$aで受け取らないかぎり、関数処理後の値である5は$aには再代入されません。
②のスクリプトでは、$aをarray_shift関数で処理しています。
array_shift関数はリファレンス渡しの関数なので返り値はありません。
この関数の実行後には、array_shiftのパラメータに指定した$bの値が自動で処理後の値に再代入されることになります。
③のスクリプトでは、ユーザー定義関数のパラメータをリファレンス渡しに変更しています。
通常の値渡しからリファレンス渡しに変更するには、関数のパラメータである変数の先頭に&を付ける必要があります。
&を付けると、そのパラメータはリファレンス渡しということになります。
なので③のスクリプトにあるccc関数はリファレンス渡しの関数ということになりますから、ccc関数の実行結果を受け取るために用意した$dの中にはなにも値は代入されません。
リファレンス渡しの関数には返り値が存在しないからです。
以上です。