...の意味(PHP5.6以降の話)

  • 4
    いいね
  • 0
    コメント

Laravelのhelperを見ていたら

<?php
    /**
     * Dump the passed variables and end the script.
     *
     * @param  mixed
     * @return void
     */
    function dd(...$args)
    {
        foreach ($args as $x) {
            (new Dumper)->dump($x);
        }

        die(1);
    }

なんか引数が見慣れない形をしている

...って何?

変数に余韻を残したいのか?と思う「...」ですが
ちゃんと意味はありました

公式ドキュメント

http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list

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

つまり、 無限引数の関数が作れる

PHP5.6より前でも可変長の引数はあった

参考: http://php-beginner.com/reference/userfunction/arg_len.html

<?php
function my_func5(){
  $arg_num = func_num_args(); //引数の数取得
  $key = 0; //アクセスする引数番号
  $arg_list = func_get_args(); //引数リストを配列に格納

  if($arg_num >= $key+1){ //引数番号以上のリスト数があれば出力
    echo func_get_arg($key)."行:";
  };

  for($i=0;$i<$arg_num;$i++){ //引数の数分ループ
    echo $arg_list[$i];
  };
};
my_func5("あ","い","う","え","お");
?>

前からできたことのようで
PHP5.6以降で ... と記述することでスリムに書けるようになったよーということ

使い所

関数の引数として使う

http://php.net/manual/ja/migration70.new-features.php#migration70.new-features.scalar-type-declarations

<?php
// 渡された引数を全部足す関数
function sumOfInts(int ...$ints)
{
    return array_sum($ints);
}

var_dump(sumOfInts(2, '3', 4.1));

一見扱うには怖そうな可変長の引数も
上のような型宣言も付けることにより、安全に扱うことができる

関数に渡す値として使う

<?php

function hoge( $key, $value1, $value2 = null, $value3 = '') {

}

$array = [1, 2, 'fuga'];

hoge($key, ...$array);

上の例のように、値渡しに ... を使う時は
変数が配列だったら個々の引数として展開されて関数に渡される

この使われ方はLaravelのcoreを調べてみるとかなり多く、
フレームワークのような引数を柔軟に処理をすることが求められる場合に
使われることが多いのかな?という印象だった

まとめ

... は、関数の引数定義、引数渡しで使われる
なにか便利そうなもの