おぼえがき

過ちては則ち改むるにうんぬんかんぬん

関数の値渡しとリファレンス渡し(参照渡し)について(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1における関数の値渡しとリファレンス渡し(参照渡し)について

<?php

//①値渡し
$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の中にはなにも値は代入されません。

リファレンス渡しの関数には返り値が存在しないからです。

 

 

以上です。