…$args
関数の引数を...変数名
のように指定すると、任意の個数の変数を渡すことができる。
受け取った関数では、配列$argsの各要素に引数の値がセットされている(要素数が0や1の場合も配列)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php function var_args(string ...$args) { echo var_export($args, true) . PHP_EOL; return; } var_args('Allen', 'Bill', 'Charley'); // array ( // 0 => 'Allen', // 1 => 'Bill', // 2 => 'Charley', // ) var_args('Allen'); // array ( // 0 => 'Allen', // ) var_args(); // array ( // ) |
型の混在
上の例ではstring
型を指定して全ての引数を文字列として扱っていて、すべての値がstring型である(あるいはキャスト可能である)必要がある。
型を指定しない場合は、与えられたそれぞれの引数の型のままで配列に格納される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function mixed_args(...$args) { var_dump($args, true); return; } mixed_args('zero', 1, 2.0); // array(3) { // [0] => // string(4) "zero" // [1] => // int(1) // [2] => // double(2) // } |
単純引数との混在
最後尾は可能
通常の引数が並んだその後、最後尾に可変長引数を置くことができる。
可変長以外の引数はデフォルト値がなければ省略できないが、可変長引数は0個でもよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
unction following($arg1, ...$others) { var_dump($arg1); var_dump($others); return; } following('one', 1, 'three'); // array(2) { // [0] => // int(2) // [1] => // string(5) "three" // } following('one'); // string(3) "one" // array(0) { // } following(); // ArgumentCountError: Too few arguments to function following(), 0 passed |
先頭や中間は不可
可変長引数を先頭や単純引数の間に置くことはできない。
1 2 3 4 5 6 7 8 9 |
function middle($head, ...$args, $tail) { return; } // Fatal error: Only the last parameter can be variadic function preceding(...$args, $another) { return; } // Fatal error: Only the last parameter can be variadic |
逆の使い方
複数の引数を...$array
で受けると、それらを要素とした$arrayが得られる。逆に$array
が配列の時...$array
は分解された各要素を返す。
これらはコレクションでもないばらばらの値なので、echo
で出力したりforeach
で使うことはできない。
以下の例では、配列を1つ1つの要素に分解して、それらを引数に与えて最大値・最小値を得ている。
1 2 3 4 5 6 |
$array = [2, 3, 1, 5, 4]; echo max(...$array) . PHP_EOL; // 5 echo min(...$array) . PHP_EOL; // 1 |
以下の例では、2つの引数を配列の要素として準備して関数に与えている。
1 2 3 |
$array = [2, 4]; echo pow(...$array) . PHP_EOL; // 16 |