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つだけ定義可能