本文给大家带来了关于php的相关知识教程分享,一起聊聊Argument unpacking与Named Parameter之详细内容,希望能给大家带来帮助。
PHP8.0教程:聊聊Named Parameter
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"
注意在调用的时候,我也使用了…,这里的意思就是,把…后面的数组解开,按照顺序分别依次传递给被调用的函数,第一个元素对应第一个参数, 第二个对应第二个。
但是注意,这里的位置是跟填充位置相关的,跟索引无关,也就是说:
$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");
输出结果也是一样的。
关于PHP8的详细解析到这里就结束了,翼速应用平台内有更多相关资讯,欢迎查阅!
我来说两句