11
11

More than 5 years have passed since last update.

【PHP】受け取った可変長引数を別の関数に可変長引数として渡す

Last updated at Posted at 2018-01-21

使用したPHPのバージョン: 7.1.12

PHPでも他の多くの言語と同様に可変長の引数を受け取ることができます。
その場合、引数リストに...トークンを含めます。

function func($arg1, ...$args) {
    // $argsには2つ目以降の引数が配列として入る
}

※ PHP5.5までは func_get_args() で引数を受け取っていました。

可変長の引数を受ける関数のラッパー関数を作る場合などに、単純に

function func($arg1, ...$args) {
    // do something
}

function wrapper_func($arg1, ...$args) {
    // do something

    func($arg1, $args); // これでは上手くいかない
}

とするわけにはいきません。

このような場合、call_user_func_array関数で呼び出します。

(2018/1/22追記)コメントで教えていただきました。

このような場合、関数呼び出しで...トークンを用いると可変長の引数を渡すことができます。


function wrapper_func($arg1, ...$args) {
    // do something

    func($arg1, ...$args); // ...トークンで引数を展開できる
}

(2018/1/22追記)以下は修正前の記事です。

関数の場合

function func($arg1, ...$args) {
    // do something
}

function wrapper_func($arg1, ...$args) {
    // do something

    call_user_func_array("func", array_merge([$arg1], $args));
}

メソッドの場合

class Test {
    function method($arg1, ...$args) {
        // do something
    }

    function wrapper_method($arg1, ...$args) {
        // do something

        call_user_func_array([$this, "method"], array_merge([$arg1], $args));
    }
}

クラス外からは同様に

$obj = new Test();

function wrapper_func($arg1, ...$args) {
    // do something

    call_user_func_array([$obj, "method"], array_merge([$arg1], $args));
}

静的メソッドの場合

class Test {
    static function method($arg1, ...$args) {
        // do something
    }

    static function wrapper_method($arg1, ...$args) {
        // do something

        call_user_func_array([get_called_class(), "method"], array_merge([$arg1], $args));
    }
}

静的メソッドをクラスの外から呼び出す場合は

call_user_func_array(["ClassName", "method_name"], array_merge([$arg1], $args));

または

call_user_func_array("ClassName::method_name", array_merge([$arg1], $args));

で呼び出せます。

参考

引数を可変長引数で受け取り、可変長引数で渡す

11
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11