0x00 缘起
在laravel的源码里经常可以看到下面的函数形式
$func(...$args)
0x01 可变参数旧写法
这表示$func支持可变参数,在php5.6之前则是在函数体内调用 func_get_args(),获取多参数
<?php
function foo()
{
$numargs = func_num_args();
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "<br />\n";
}
$arg_list = func_get_args();
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
}
}
foo(1, 2, 3);
func_num_args是获取参数的个数,func_num_arg是获取索引处的参数值。
如果只看函数名的话,估计都以为它是个参数为空的函数吧,而且还需要额外调用辅助函数来获取参数列表。
0x02 新语法,新用法
现在让我们看看php5.6的新变参语法...$args。
function foo(...$args)
{
$numargs = count($args);
echo "Number of arguments: $numargs<br />\n";
if ($numargs >= 2) {
echo "Second argument is: " . func_get_arg(1) . "<br />\n";
}
$arg_list = $args;
for ($i = 0; $i < $numargs; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
}
}
foo(1,2,3);
另外...$args可以直接传数组,支持在内部解包,这样先在外部把参数组装好,更优雅,如
$args = [1,2,3];
foo(...$args);
注意参数列表的数组不能是关联数组。
0x03 扩展
laravel中可以看到$instance->$method(...$args);,怎么改写为php5.6以下的呢?
想想调用自定义函数,对就是call_user_func_array,可以改写为如下形式:
call_user_func_array([$instance,$method], $args);
可以看到新的变参形式不断好理解,而且书写优雅。