使用した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));
で呼び出せます。