PHP8.0新特性之Named Parameters(命名参数)

作者: 温新

分类: 【PHP基础】

阅读: 2173

时间: 2022-01-23 14:12:13

命名参数,PHP8.0允许在函数/方法调用中使用命名参数。

简单地说,就是可以在调用函数或方法传递参数时,可以给参数取一个与函数参数或方法一样的名字。

位置参数

先来看看PHP8.0之前,使用位置参数的案例

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">say</span>(<span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$name</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$age</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">echo</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$name</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$age</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">}</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">say</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'王五'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">12</span>); <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 王五12</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">say</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">12</span>, <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'李四'</span>); <span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 12李四</span></span>

使用位置参数,得到的是完全不一样的结果,有了命名参数后,调用函数或方法时,位置就可以随意放置了。

命名参数案例

自定义函数

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">say</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$name</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">int</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$age</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">echo</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$name</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$age</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">}</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 结果都是 李四19</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">say</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">name</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'李四'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">age</span>:<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">19</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">say</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">age</span>:<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">19</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">name</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'李四'</span>);</span>

需要注意的是,调用时传递参数的名字需要和方法定义时的名字一致。

内置函数

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 默认位置</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$res1</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">str_contains</span>(<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'php是世界上最好语言'</span>, <span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'php'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 使用命名参数后,位置可以发生变化</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$res2</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">str_contains</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">haystack</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'php是世界上最好语言'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">needle</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'php'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$res3</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">str_contains</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">needle</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'php'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">haystack</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'php是世界上最好语言'</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 输出结果都是 true</span></span>

PHP8.0以后的新函数支持命名参数;小于8的版本,绝大多数函数不支持命名参数,也就是说,命名参数不向前兼容。

参数跳过

<span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">function</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">say</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">string</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$name</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">int</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$age</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">18</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$sex</span> <span style="box-sizing: border-box;color: rgb(86, 182, 194) !important">=</span> <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">1</span>) {</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(198, 120, 221) !important">echo</span> <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$name</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$age</span>, <span style="box-sizing: border-box;color: rgb(224, 108, 117) !important">$sex</span>;</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px">}</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 全部都传递参数</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">say</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">name</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'李四'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">age</span>:<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">19</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sex</span>:<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">2</span>);</span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(98, 151, 85) !important">// 修改性别,使用命令参数跳过age参数</span></span><br></br><span style="box-sizing: border-box;color: rgb(171, 178, 191);padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">say</span>(<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">name</span>:<span style="box-sizing: border-box;color: rgb(152, 195, 121) !important">'王美丽'</span>, <span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">sex</span>:<span style="box-sizing: border-box;color: rgb(209, 154, 102) !important">2</span>);</span>

使用命名参数时,可以为指定的参数赋值。

需要注意的是,可选参数一定要在必选参数的后面;必选无法跳过,必须传递参数。

我是温新

每天进步一点,就一点点

请登录后再评论