基礎

PHPの可変長引数|任意の数の引数を受け取る関数の作り方

PHPでは ...(スプレッド演算子)を仮引数の前に付けることで、可変長引数(variadic arguments)を受け取る関数を定義できます。引数の数が決まっていない場合や、任意の個数の値を処理したい場合に非常に便利です。

可変長引数はPHP 5.6で導入された機能で、それ以前の func_get_args() を使った方法よりも明確で読みやすいコードを書けるようになりました。

基本的な使い方

仮引数名の前に ... を付けると、渡された引数がすべて配列としてまとめられます。

PHP
<?php
function sum(...$numbers) {
    $total = 0;
    foreach ($numbers as $num) {
        $total += $num;
    }
    return $total;
}

echo sum(1, 2, 3) . "\n";
echo sum(10, 20, 30, 40, 50) . "\n";
echo sum(100) . "\n";
実行結果
6
150
100

$numbers には渡された全ての引数が配列として格納されます。1個でも5個でも、何個でも引数を渡すことができます。

通常の引数との組み合わせ

可変長引数は通常の引数と組み合わせて使えます。ただし、可変長引数は必ず最後に配置する必要があります。

PHP
<?php
function createMessage($prefix, $separator, ...$words) {
    return $prefix . ": " . implode($separator, $words);
}

echo createMessage("果物", "・", "りんご", "バナナ", "みかん") . "\n";
echo createMessage("色", ", ", "赤", "青") . "\n";
実行結果
果物: りんご・バナナ・みかん
色: 赤, 青

最初の2つの引数は $prefix$separator に格納され、残りのすべてが $words 配列に入ります。

型宣言との組み合わせ

可変長引数にも型宣言を付けることができます。すべての引数が指定した型であることが保証されます。

PHP
<?php
function average(float ...$values): float {
    if (count($values) === 0) {
        return 0.0;
    }
    return array_sum($values) / count($values);
}

echo average(85.5, 90.0, 78.3) . "\n";
echo average(100, 95, 88, 72) . "\n";
実行結果
84.6
88.75

float ...$values と宣言することで、渡された引数がすべて float 型(または自動変換可能な型)であることが保証されます。

実用的な例

ログ出力やSQL条件の組み立てなど、実務で役立つパターンを紹介します。

PHP
<?php
// HTMLのリスト要素を生成する
function createList(string $tag, string ...$items): string {
    $html = "<" . $tag . ">\n";
    foreach ($items as $item) {
        $html .= "  <li>" . htmlspecialchars($item) . "</li>\n";
    }
    $html .= "</" . $tag . ">";
    return $html;
}

echo createList("ul", "PHP", "JavaScript", "Python") . "\n";

// 複数の条件でフィルタリング
function filterByKeys(array $data, string ...$keys): array {
    return array_intersect_key($data, array_flip($keys));
}

$user = ["name" => "田中", "age" => 30, "email" => "t@example.com", "password" => "secret"];
$public = filterByKeys($user, "name", "age", "email");
print_r($public);
実行結果
<ul>
  <li>PHP</li>
  <li>JavaScript</li>
  <li>Python</li>
</ul>
Array
(
    [name] => 田中
    [age] => 30
    [email] => t@example.com
)
ポイント

可変長引数で受け取った値は通常の配列なので、count()array_map()foreach など、配列に対する全ての操作が可能です。引数が0個の場合は空配列になります。

注意

可変長引数は関数定義の中で1つしか使えず、必ず最後の引数でなければなりません。function f(...$a, $b) のような定義はエラーになります。

まとめ

  • ... を仮引数の前に付けると、任意の数の引数を配列として受け取れる
  • 通常の引数と組み合わせる場合は、可変長引数を最後に配置する
  • 型宣言と組み合わせることで、全引数の型を保証できる
  • 受け取った値は通常の配列として自由に操作できる
  • 1つの関数に可変長引数は1つだけ定義可能