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);
可以看到新的變參形式不斷好理解,而且書寫優雅。