PHP 5.6 之前是应用函数 func_num_args()
,func_get_arg()
,和 func_get_args()
实现传递可变参数列表。
PHP 可变参数(…)
PHP 5.6 引进了 … 操作符,官网名称是 splat operator,或者 spread operator(数组延展操作符),也有人称为 Argument unpacking(参数解包)。
具体看 PHP 官网提供的例子就好了:
应用 … 来拜访变量参数
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {$acc += $n;}
return $acc;
}
echo sum(1, 2, 3, 4);
输入:10
应用 … 来传递参数
function add($a, $b) {return $a + $b;}
echo add(...[1, 2])."n";
$a = [1, 2];
echo add(...$a);
下面都是输入:3
多个参数
可变参数之前,还能够有别的参数,然而前面就不能有别的参数了,比方上面的例子:
function display($name, ...$args){
echo '名称:'.$name;
echo '其余信息:';
print_r($args);
}
理论利用例子
咱们拿 WordPress 中判断以后用户是否有权限的函数 current_user_can()
来举例,阐明 … 这个操作符如何改善的代码可读性的。
在 PHP 5.6 之前的代码:
function current_user_can($capability) {$current_user = wp_get_current_user();
if (empty( $current_user) ) {return false;}
$args = array_slice(func_get_args(), 1 );
$args = array_merge(array( $capability), $args );
return call_user_func_array(array( $current_user, 'has_cap'), $args );
}
在没有看完所有函数代码状况下,大多数程序员都会假如这个函数只有 $capability
这一参数,然而该函数是承受可变数量参数的,WordPress 必须应用 func_get_args()
来获取所有参数,而后切开数组分片,而后再合并回去。
尽管性能实现了,然而这样编码十分不爽。当初看看应用了 … 操作符之后的代码:
function current_user_can($capability, ...$args) {$current_user = wp_get_current_user();
if (empty( $current_user) ) {return false;}
return $current_user->has_cap($capability, ...$args);
}
首先在函数定义中就分明地看到 ...$args
参数,而后传递数据也变得更加清晰,无需数组的切片和合并解决,也无需应用 call_user_func_array
回调办法,代码十分直观可读。