端くれプログラマの備忘録 PHP [PHP] 可変長引数リストの使い方

[PHP] 可変長引数リストの使い方

新しいPHPの構文に関する覚え書きとして、公式サイトから抜粋。

PHP: 関数の引数 – Manual
https://www.php.net/manual/ja/functions.arguments.php#functions.variable-arg-list

PHP 5.6 以降では、引数リストに … トークンを含めることで、その関数が可変長の引数を受け取ることを示せます。引数は、指定した変数に配列として渡されます。

… を使った、可変長引数へのアクセス

<?php
function sum(...$numbers) {
    $acc = 0;
    foreach ($numbers as $n) {
        $acc += $n;
    }
    return $acc;
}
echo sum(1, 2, 3, 4);
?>

関数を呼び出すときに … を使うと、配列変数や Traversable クラスを引数リストに含めることができます。

引数での … の使用例

<?php
function add($a, $b) {
    return $a + $b;
}
echo add(...[1, 2])."\n";
$a = [1, 2];
echo add(...$a);
?>

通常の引数を、… の前に指定することもできます。この場合は、通常の引数リストにマッチしなかったのこりの引数が … による配列に追加されます。… トークンの前に、タイプヒントを付加することもできます。タイプヒントがある場合、… が取り込むすべての引数はそのヒントに従わなければいけません。

タイプヒントつきの可変長引数

<?php
function total_intervals($unit, DateInterval ...$intervals) {
    $time = 0;
    foreach ($intervals as $interval) {
        $time += $interval->$unit;
    }
    return $time;
}

$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' days';

// これは失敗します。null は DateInterval オブジェクトではないからです。
echo total_intervals('d', null);
?>