PHPのスプレッド演算子(...)は、配列の要素を個別の引数として展開して関数に渡すことができる構文です。可変長引数が「複数の引数を配列にまとめる」のに対して、スプレッド構文は「配列を複数の引数に展開する」という逆の働きをします。
PHP 5.6で関数の引数展開として導入され、PHP 7.4以降は配列リテラル内での展開もサポートされました。データの受け渡しを柔軟にする重要な機能です。
基本的な使い方
配列の前に ... を付けて関数に渡すと、配列の各要素が個別の引数として展開されます。
PHP
<?php
function add($a, $b, $c) {
return $a + $b + $c;
}
$numbers = [10, 20, 30];
echo add(...$numbers) . "\n";
// 以下と同じ意味
echo add($numbers[0], $numbers[1], $numbers[2]) . "\n";
実行結果
60
60
...$numbers によって、配列 [10, 20, 30] が add(10, 20, 30) として展開されます。手動で各要素を取り出す必要がなく、コードがすっきりします。
配列同士のマージ
PHP 7.4以降では、配列リテラルの中でもスプレッド構文が使えます。
PHP
<?php
$fruits = ["りんご", "バナナ"];
$vegetables = ["にんじん", "大根"];
// 配列の結合
$foods = [...$fruits, "みかん", ...$vegetables];
print_r($foods);
実行結果
Array
(
[0] => りんご
[1] => バナナ
[2] => みかん
[3] => にんじん
[4] => 大根
)
array_merge() の代わりにスプレッド構文を使うことで、配列の結合をより直感的に記述できます。要素の追加位置も自由に指定できます。
可変長引数との組み合わせ
スプレッド構文と可変長引数を組み合わせると、非常に柔軟な引数の受け渡しが実現できます。
PHP
<?php
function formatList(string $title, string ...$items): string {
$result = $title . ":\n";
foreach ($items as $i => $item) {
$result .= " " . ($i + 1) . ". " . $item . "\n";
}
return $result;
}
$languages = ["PHP", "JavaScript", "Python", "Go"];
echo formatList("プログラミング言語", ...$languages);
実行結果
プログラミング言語:
1. PHP
2. JavaScript
3. Python
4. Go
実用的な例
関数のラッパーを作成する場合にスプレッド構文が特に活躍します。
PHP
<?php
// 設定値のマージ
function mergeConfig(array $defaults, array $custom): array {
return [...$defaults, ...$custom];
}
$defaults = ["debug" => false, "lang" => "ja", "timezone" => "Asia/Tokyo"];
$custom = ["debug" => true, "lang" => "en"];
$config = mergeConfig($defaults, $custom);
print_r($config);
// 関数のラッパー
function timedCall(callable $func, ...$args) {
$start = microtime(true);
$result = $func(...$args);
$elapsed = round((microtime(true) - $start) * 1000, 2);
echo "実行時間: {$elapsed}ms\n";
return $result;
}
$sum = timedCall('array_sum', [1, 2, 3, 4, 5]);
echo "結果: " . $sum . "\n";
実行結果
Array
(
[debug] => 1
[lang] => en
[timezone] => Asia/Tokyo
)
実行時間: 0.01ms
結果: 15
ポイント
PHP 8.1以降では、名前付き引数とスプレッド構文を組み合わせることもできます。連想配列をスプレッドすると、キーが引数名として使われます。例えば $args = ["b" => 2, "a" => 1]; func(...$args); のように使えます。
注意
配列リテラル内でのスプレッド構文(PHP 7.4+)は、文字列キーの配列に対してはPHP 8.1以降でのみサポートされます。PHP 7.4〜8.0では数値キーの配列のみ展開可能です。バージョンの互換性に注意してください。
まとめ
...を配列の前に付けると、要素を個別の引数に展開できる- PHP 7.4以降は配列リテラル内でも使用可能で、配列の結合が簡潔に書ける
- 可変長引数と組み合わせると柔軟な引数の受け渡しが実現できる
- 関数のラッパーや設定値のマージなど実務で活躍する場面が多い
- 文字列キー配列の展開はPHP 8.1以降でサポートされる