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 回调办法,代码十分直观可读。