スプレッド演算子と可変長引数(…)の使いどころ

PHPの...(3点ドット)は、文脈によって「展開」と「まとめ」の逆の意味を持ちます。ここが混乱の元なので整理しておきます。

関数定義では「まとめる」(可変長引数)

function sum(...$numbers): int
{
    return array_sum($numbers); // $numbersは配列
}
sum(1, 2, 3); // 6

引数側に書くと、渡された引数を配列としてまとめて受け取ります。個数が決まっていない引数を扱うときに使います。

呼び出しでは「展開する」

$args = [1, 2, 3];
sum(...$args); // 配列を個々の引数に展開して渡す

配列の結合にも使える

$base = ['a', 'b'];
$more = ['c', 'd'];
$all = [...$base, ...$more]; // ['a','b','c','d']

array_mergeより見た目がすっきりします。PHP 8.1からは文字列キーの展開もできるようになりました。

まとめ

定義側の...は集める、呼び出し側・配列リテラル内の...は広げる。同じ記号で逆向きなので最初は戸惑いますが、「どちら側に書いているか」で判断すれば迷いません。可変長引数はarray型の引数で代用できることも多いので、呼び出し側の書きやすさで選ぶといいと思います。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です