PHP入門 引数のさまざまな記法
ユーザー定義関数の引数の既定値、引数の参照渡し、可変長引数の関数、アンバック等のテクニックについて紹介しています。
引数の既定値
代入演算子「=」を利用することで、仮引数に既定値を設定できます。getTriangleArea関数の引数$base、$heightにそれぞれ既定値5、1を指定する例です。
<?php
function getTriangleArea(float $base = 5, float $height = 1): float {
return $base * $height /2;
}
$area = getTriangleArea();
print "三角形の面積は{$area}です。<br />"; //結果:三角形の面積は2.5です。
$area = getTriangleArea(10);
print "三角形の面積は{$area}です。<br />"; //結果:三角形の面積は5です。➊
$area = getTriangleArea(10,5);
print "三角形の面積は{$area}です"; //結果:三角形の面積は25です。
既定値とは、その引数を省略した場合に既定で設定される値のことです。既定値を持つ引数は省略が可能です。➊は引数$heightだけ省略した例です。ただし、引数$baseだけを省略することはできません。省略できるのはあくまで後方だけとなります。
同様の理由で、$heightに必須の引数を置くことはできません。非推奨エラーが発生します。
引数の参照渡し
引数を参照渡しするには、仮引数の頭に「&」を付与します。
<?php
function increment(int &$num): int{
$num++;
return $num;
}
$value = 10;
print increment($value); //結果:11
print $value; //結果:11
名前付き引数
名前付き引数とは、呼び出し時に名前を明示的に指定できる引数のことです。
print getTriangleArea(height: 10);
print getTriangleArea(height: 10, base: 50);
「仮引数名:値」の形式で呼び出します。名前付き引数を利用することで、次のメリットがあります。
- 引数が多くなっても、意味を把握しやすい
- 必要な引数だけをスマートに表現できる。
- 引数の順序を自由に変更できる
たとえば仮引数を$baseから$widthに変更した時は、呼び出し元も変更しなければなりません。
可変長引数の関数
可変長引数の関数とは、引数の個数があらかじめ決まっていない関数のことです。
print max(108, 15, -10); //引数は3個
print max(214, 64, 12, 5, -15, 1080); //引数は6個
可変長引数の関数は、ユーザー定義関数として定義することもできます。
<?php
function total(float ...$args): float{
//結果を格納するための変数$result
$result = 0;
//取得した引数を順に加算処理
foreach($args as $arg){
$result += $arg;
}
return $result;
}
print total(7, 3, 10); //結果:20
print total(11, -5, 4, 88); //結果:98
可変長引数の関数では、仮引数の直前に「…」ピリオドを3つ付与します。これによって、渡された任意個数の引数を配列としてまとめて取得できます。あとは、配列から値を取り出していくだけです。foreachループで引数$argsからすべての引数を取り出し、その値を合算してから結果を戻り値として返しています。
可変長引数と通常の引数の混在
引数$pathで指定されたファイルを読み込み、可変長引数$artsの対応する値で置き換える関数です。
<?php
function replaceContents(string $path, string ...$args): string{
//指定されたパスからファイルを読み込み
$data = file_get_contents($path);
//可変長引数を順番に処理し、{0}、{1}、・・・と置き換え
for($i = 0; $i < count($args); $i++){
$data = str_replace('{'.($i).'}', $args[$i], $data);
}
return $data;
}
//data.datを読み込み出力
print replaceContents('data.dat','山田太郎','2024/01/01');
可変長引数と、通常の引数を同居させる場合、「可変長関数は引数リストの末尾に置かなければならない」ということです。
可変長引数で「1個以上の引数を渡す方法」
最低でも1つ以上の引数を要求したい場合、関数の仕様(引数/戻り値)はより明確にすべき観点からすると、次のコードが最善です。
function total(float $init, float …$args){
$result = $init;
・・・
}
引数を1つ受け取るのは確実なので、1個目の引数は普通の引数$initとして宣言し、2個目以降の引数を可変長引数として宣言します。これにより使用はりり明確になり、VSCodeのようにPHPに対応したエディターであれば、実行前にエラーが検出できるようになります。
「…」演算子による引数のアンパック
「…」演算子は、引数で利用することで、配列(正確にはforeachブロックで処理できるすべてのオブジェクト)を個々の値に展開(アンパック)できます。配列引数の前方に「…」演算子を付与します。
<?php
function getTriangleArea(float $base, float $height): float{
return $base * $height / 2;
}
print getTriangleArea(...[10,5]); //結果:25
PHP7.4以降では「…」演算子を利用して、配列内でも値をアンパックできるようになりました。
<?php
$data = ['山田','工藤'];
$member = ['佐藤','田中',...$data,'濱口'];
print_r($member);