浅析PHP8.0特性:Named Parameter(命名参数)

青灯夜游

青灯夜游

2022-11-18

2298人浏览

转载

年前花了点时间,对Yar的性能做了一些做了一些提升,但是也遇到一个让我有点不舒服的当初没有良好设计遗留的问题,就是在并行调用RPC的时候,现在的方法原型是:

public static Yar_Concurrent_Client::call(string $uri, string $method, ?array $arguments = NULL, ?callable $callback = NULL, ?callable $error_callback = NULL, ?array $options = NULL):null|int|bool {}

是不是一看就很头大?

因为在实际的使用过程中,很有可能回调函数和错误回调函数是空的,因为可以真正发起调用的时候,也就是在loop重全局指定:

Yar_Concurrent_Client::loop(?callable $callback = NULL, ?callable $error_callback = NULL, ?array $options = NULL):?bool {}

而很多时候$options是有用的,根据调用相关,所以就导致,实际的使用的时候,大量的并行调用的代码会在参数中写很多的NULL, 类似:

Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val1"));
Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val2"));
Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val2"));
Yar_Concurrent_Clinet::call("https://xxx.com/api", "method", array("arguments"), NULL, NULL, array(YAR_OPT_HEADER=>array("header:val4"));

于是我一直想如何能让这样的调用更优雅一些,曾经一度我想使用多态,或者新增一个API,类似:

public static Yar_Concurrent_Client::callArray(array $arguments):null|int|bool {}

但强迫症让我觉得这样做,遗祸无穷, 今天早上我突然想起以前曾经看到过的一个RFC,于是找了半天,发现早在PHP5.6的时候,就commit了, 但反正我比较老派,新特性研究的少,也是没怎么用过,就不知道大家是否会用过了。 ?

就是今天要介绍的第一个特性:Argument unpacking。

Argument unpacking

我们知道PHP支持可变参数,也就是variadic function. 比如对于如下的函数定义:

function variadic(...$arguments) {
    var_dump($arguments);
}

注意参数的定义,使用了三个点…(ellipsis符号), 意思就是无论你在调用这个函数的时候传递了多少个参数,这些参数都会被打包成一个名字为$arguments的数组:

variadic();
//output: array(0) { }
variadic(NULL);
//output: array(1) { [0]=> NULL }
variadic("foo", "bar");
//output: array(2) { [0]=> string(3) "foo"  [1]=> string(3) "bar" }
variadic(NULL, array(), "dummy");
//output: array(3) { [0]=> NULL [1]=>[] [2]=> string(5) "dummy" }

当然,这个不是我们今天要用到的,这个特性还有一个对应的在调用时刻使用的兄弟形式,叫做argument unpacking:

比如,类似上面我的那个问题,我们定义了一个函数

function dummy($a, $b = NULL, $c = NULL, $d = NULL, $e = NULL) {
    var_dump($a, $b, $c, $d, $e);
}

如果大部分情况下我们的参数b, c,  d都是NULL, 但是e可能需要传递,那我们就可以使用argument unpacking来避免代码中大量的NULL参数,类似:

$arguments = array(
    "First argument",
    NULL,  NULL,  NULL,
    "Fifth argument",
);
 
dummy(...$arguments);
 
//output:
// string(14) "First argument"
// NULL
// NULL
// NULL
// string(14) "Fifth argument"

注意在调用的时候,我也使用了…,这里的意思就是,把…后面的数组解开,按照顺序分别依次传递给被调用的函数,第一个元素对应第一个参数, 第二个对应第二个。

但是注意,这里的位置是跟填充位置相关的,跟索引无关,也就是说:

PHP 8.5.5
PHP 8.5.5

PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。

下载
$arguments = array(
    4=> "First argument",
    0=> "Fifth argument"
),

这样的形式, 索引4依然是被认为是第一个参数。

想到这个以后,我就突然发现,我不需要给Yar引入新东西了,最开的例子就可以变成:

$arguments = array(
    "https://xxx.com/api",
    "method",
    array("arguments"),
    NULL, NULL, 
    "options" => array(YAR_OPT_HEADER => array("header:val1")
)
Yar_Concurrent_Clinet::call(...$arguments);
 
$arguments["options"][YAR_OPT_HADER] = ["header:val2"];
Yar_Concurrent_Clinet::call(...$arguments);
 
$arguments["options"][YAR_OPT_HADER] = ["header:val3"];
Yar_Concurrent_Clinet::call(...$arguments);
 
$arguments["options"][YAR_OPT_HADER] = ["header:val4"];
Yar_Concurrent_Clinet::call(...$arguments);
Yar_Concurrent_Clinet::call(...$arguments);

你以为这就完了么?

考虑到如上的代码,还是有一个问题,就是需要构造一个中间数组,对于强迫症的我们来说,总还是觉得会有点,那啥…

但其实我们还可以利用PHP8.0中引入的另外一个RFC, Named parameter:

Named Parameter

在PHP8.0以后,容许用户在传递参数的时候,指定参数名字, 比如还是对于上面的例子函数:

function dummy($a, $b = NULL, $c = NULL, $d = NULL, $e = NULL) {
    var_dump($a, $b, $c, $d, $e);
}

现在我们可以在调用的时候,指定要传递的参数名字,比如:

dummy(a:"dummy", e:"foo");
//output:
// string(5) "dummy"
// NULL
// NULL
// NULL
// string(3) "foo"

也就是说,我指定了传递给a和e参数,没有指定的就是默认缺省值,你甚至可以不按声明顺序来,比如:

dummy(e:"foo", a:"dummy");

输出结果也是一样的。

这样以来,开头的代码就可以变成:

Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val1")));
Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val2")));
Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val3")));
Yar_Concurrent_Client::call("https://xxx.com/api", "method", arguments:array("arguments"), options:array(YAR_OPT_HEADER=>array("header:val4")));

你就可以在调用的时候,想传那个传那个,想怎么传就怎么传

虽然代码相比argument unpacking还是有点长,但是既解决了不用写那么多NULL,又不会引入新的中间变量。

于是,问题完美解决,我也不用引入新的API了 :)

原文地址:https://www.laruence.com/2022/05/10/6192.html

推荐学习:《PHP视频教程

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

420

3

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

2024.03.01

1487

6

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

187

14

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.04

1387

5

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

2023.10.07

253

5

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.16

4621

6

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

10

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习