如何将可变数量的parameter passing给PHP函数

我有一个PHP函数,使用func_num_args()func_get_args() )的可变数量的参数,但我想传递函数的参数数量取决于数组的长度。 有没有办法用可变数量的参数调用 PHP函数?

如果你在数组中有你的参数,你可能会对call_user_func_array函数感兴趣。

如果你想传递的参数的数量取决于一个数组的长度,这可能意味着你可以将它们自己打包到一个数组中,并使用那个参数作为call_user_func_array的第二个参数。

您传递的数组的元素将被您的函数作为不同的参数接收。

例如,如果你有这个function:

 function test() { var_dump(func_num_args()); var_dump(func_get_args()); } 

你可以将你的参数打包到一个数组中,如下所示:

 $params = array( 10, 'glop', 'test', ); 

然后,调用函数:

 call_user_func_array('test', $params); 

这段代码将输出:

 int 3 array 0 => int 10 1 => string 'glop' (length=4) 2 => string 'test' (length=4) 

即3个参数; 就像这样调用函数:

 test(10, 'glop', 'test'); 

现在可以在PHP 5.6.x中使用…运算符(在某些语言中也称为splat运算符):

例:

 function addDateIntervalsToDateTime( DateTime $dt, DateInterval ...$intervals ) { foreach ( $intervals as $interval ) { $dt->add( $interval ); } return $dt; } addDateIntervaslToDateTime( new DateTime, new DateInterval( 'P1D' ), new DateInterval( 'P4D' ), new DateInterval( 'P10D' ) ); 

在新的PHP 5.6中 ,您可以使用... operator而不是使用func_get_args()

所以,使用这个,你可以得到你传递的所有参数:

 function manyVars(...$params) { var_dump($params); } 

PHP 5.6开始 ,一个可变参数列表可以用...运算符指定。

 function do_something($first, ...$all_the_others) { var_dump($first); var_dump($all_the_others); } do_something('this goes in first', 2, 3, 4, 5); #> string(18) "this goes in first" #> #> array(4) { #> [0]=> #> int(2) #> [1]=> #> int(3) #> [2]=> #> int(4) #> [3]=> #> int(5) #> } 

正如你所看到的, ...操作符收集数组中的variables列表。

如果您需要将可变parameter passing给另一个函数,那么...仍然可以帮助您。

 function do_something($first, ...$all_the_others) { do_something_else($first, ...$all_the_others); // Which is translated to: // do_something_else('this goes in first', 2, 3, 4, 5); } 

PHP 7开始 ,参数的variables列表可以被强制为全部相同的types。

 function do_something($first, int ...$all_the_others) { /**/ } 

对于那些正在寻找一种方法来做到这一点与$object->method

 call_user_func_array(array($object, 'method_name'), $array); 

我在一个构造函数中成功地调用了带有可变参数的variablesmethod_name。

你可以叫它。

 function test(){ print_r(func_get_args()); } test("blah"); test("blah","blah"); 

输出:

Array([0] => blah)Array([0] => blah [1] => blah)

然而,我知道一个古老的问题,在这里没有一个答案能够很好地回答这个问题。

我只是玩了PHP和解决scheme看起来像这样:

 function myFunction($requiredArgument, $optionalArgument = "default"){ echo $requiredArgument . $optionalArgument; } 

这个函数可以做两件事情:

如果调用只有必需的参数: myFunction("Hi")它将打印“嗨默认”

但是,如果使用可选参数调用它: myFunction("Hi","me")它将打印“喂我”;

我希望这能帮助那些正在寻找这条路的人。

我很惊讶这里没有人提到简单的传递和提取数组。 例如:

 function add($arr){ extract($arr, EXTR_REFS); return $one+$two; } $one = 1; $two = 2; echo add(compact('one', 'two')); // 3 

当然,这不提供参数validation 。 为此,任何人都可以使用我的预期function: https : //gist.github.com/iautomation/8063fc78e9508ed427d5

这是一个使用魔术方法__invoke的解决scheme

(自PHP 5.3起可用)

 class Foo { public function __invoke($method=null, $args=[]){ if($method){ return call_user_func_array([$this, $method], $args); } return false; } public function methodName($arg1, $arg2, $arg3){ } } 

从同一个class级里面:

 $this('methodName', ['arg1', 'arg2', 'arg3']); 

从一个对象的实例:

 $obj = new Foo; $obj('methodName', ['arg1', 'arg2', 'arg3'])