11
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

使用した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));

で呼び出せます。

参考

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
11
Help us understand the problem. What are the problem?