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