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);
実行結果
実行結果