PHP可变长度参数列表的实用技巧
原文链接:https://my.oschina.net/cxz001/blog/825671
php5.6添加了一个新的特性,那就是 可变长度参数列表 , 它提供了什么便捷的语法特性呢?
两个例子:
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);//可变长度实参
是不是瞬间感觉解放了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了