PHP可变长度参数列表的实用技巧
2017-01-16 15:01
169 查看
php5.6添加了一个新的特性,那就是 可变长度参数列表 , 它提供了什么便捷的语法特性呢?
两个例子:
1.可变长度的形参
这个主要说明使用可变长度形参比原始的 func_get_args() 获取函数参数数组更加方便。
2.可变长度的实参
恩,这个看上去好像跟 call_user_func_array 没什么区别哈 ,写法上简洁一些。
如果仅仅是把两个例子分开看 ,都没有令人心动的感觉,也就是锦上添花罢了,但是看接下来的例子,这是一个需要对另外一个类方法进行封装的场景
首先B需要知道A::foo方法的所有参数定义,重复定义一次,然后调用的时候还需要逐个传递参数,这一看就感觉很不好,万一 A::foo 定义发生变化,B也要跟着改。
现在有了可变长度参数,我们可以这样写了
是不是瞬间感觉解放了
两个例子:
1.可变长度的形参
function foo($name, ...$options) { foreach ($options as $val) echo($val); } foo('aaa','bbb','ccc','ddd'); //输出的应该是 'bbbcccddd';
这个主要说明使用可变长度形参比原始的 func_get_args() 获取函数参数数组更加方便。
2.可变长度的实参
function foo($name, $value) { echo $name.':'.$value; } $args = ['k1','v1']; foo(...$args); //输出 k1:v1
恩,这个看上去好像跟 call_user_func_array 没什么区别哈 ,写法上简洁一些。
如果仅仅是把两个例子分开看 ,都没有令人心动的感觉,也就是锦上添花罢了,但是看接下来的例子,这是一个需要对另外一个类方法进行封装的场景
class A { function foo($a,$b,$c='',$d=''){} } //class B 需要调用 class A的foo方法,但是除了第一个参数之外,所有参数原样传递给 A::foo class B { //$a,$b,$c='',$d='' 原样定义 function foo($x,$a,$b,$c='',$d='') { //手动填写每个实参 (new A)->foo($a,$b,$c,$d); } }
首先B需要知道A::foo方法的所有参数定义,重复定义一次,然后调用的时候还需要逐个传递参数,这一看就感觉很不好,万一 A::foo 定义发生变化,B也要跟着改。
现在有了可变长度参数,我们可以这样写了
class A { function foo($a,$b,$c='',$d=''){} } //class B 需要调用 class A的foo方法,但是除了第一个参数之外,所有参数原样传递给 A::foo class B { //通过可变长度形参,不需要知道A::foo的定义 function foo($x,...$args) { //把 $args 通过可变长度实参功能原封不动传给 A::foo (new A)->foo(...$args); } } $b = new B; $argsForA = [1,2]; $b->foo('x', ...$argsForA);//可变长度实参
是不是瞬间感觉解放了
相关文章推荐
- PHP 可变长度参数列表
- C语言(函数传递可变长度的参数列表)va_arg
- Python中函数参数(默认、列表、可变长度、字典类型)
- Javascript可变长度参数列表 - Arguments对象
- php中 传值,传址,默认参数的值,函数名可变,函数可变长度参数
- @weakify与@strongify的装逼写法, 用宏实现计算一个可变参数列表的长度
- 可变长度参数列表
- java函数参数后面加三个点——可变长度参数列表
- JAVA类型后面跟3个点(可变长度参数列表)
- php方法固定传参和可变参数的参数列表
- Ruby:方法中可变长度参数列表
- java类型后面加三个点——可变长度参数列表
- JAVA类型后面跟3个点(可变长度参数列表)
- c#基础之长度可变类型相同的参数列表
- php实现函数可变参数列表
- Python中如何使用*args 和 **kwargs (非keyworded,可变长度参数列表 keyworded形式可变长度的参数列表)
- c#基础之长度可变类型相同的参数列表
- C语言深入浅出可变参数函数的使用技巧(转)
- 可变长度函数参数的原理及使用
- 实用技巧--可选可填的下拉列表