PHP 8中将引入命名参数

2020-07-27 12:30:54

千钧一发,但是命名参数--也称为命名参数--在PHP8中是受支持的!在这篇文章中,我将讨论它们的来龙去脉,但首先让我用几个野外的例子向你展示它们的样子:

Class{public function(public string$name,public string$email,public int$age,){}}$data=new CustomerData(name:$input[';name';],email:$input[';email';],age:$input[';age';],);

您可能已经从示例中猜到了:命名参数允许您根据其参数名称而不是参数顺序将输入数据传递给函数。

我会争辩说,命名参数是一个很棒的功能,它将对我的日常编程生活产生重大影响。不过,您可能会想知道细节:如果您传递了错误的名称,那么数组传播语法又有什么用呢?那么,让我们深入研究一下所有这些问题。

让我们假设这个特性是一个很有争议的特性,有一些反对不添加它们的论据。然而,我要说的是,它们的好处远远超过了对向后兼容性问题或API膨胀的担忧。在我看来,它们将允许我们编写更干净、更灵活的代码。

例如,命名参数允许您跳过默认值。再看一下Cookie示例:

Setcookie(String$name,String$Value=";";,int$Expires=0,String$Path=";";,String$domain=";";,bool$secure=false,bool$httponly=false,):bool。

在我展示的示例中,我们不需要设置a cookie$值,但是需要设置过期时间。命名参数使此方法调用更加简洁:

除了跳过带有默认值的参数之外,还有一个好处是清楚地知道哪个变量做了什么;这一点在具有大量方法签名的函数中特别有用。现在我们可以说,很多争论通常都是一种代码气味;不管怎样,我们仍然要处理它们,所以最好有一种理智的方式来这样做,总比什么都没有要好。

抛开基础知识不谈,让我们来看看命名参数可以做什么,不可以做什么。

首先,命名参数可以与未命名参数(也称为有序参数)组合。在这种情况下,有序参数必须始终放在第一位。

Class{public function(public string$name,public string$email,public int$age,){}}。

$input=[';age';=&>;25,';name';=&>;&39;,';brent';,';电子邮件';=&>;[email protected]';,];$data=new CustomerData(...$input);

但是,如果数组中缺少必需的条目,或者如果存在未作为命名参数列出的键,则将引发错误:

$input=[';年龄';=&>;25,';名称';=&>;&39;,';Brent';,';电子邮件';=&>;[email protected]';,';unnownProperty';=&>;';这是不允许的';,];$data=new CustomerData(...$。

可以在输入数组中组合命名参数和有序参数,但前提是有序参数必须遵循与前面相同的规则:它们必须先出现!

如果您正在使用可变函数,命名参数将与它们的键名一起传递到可变参数数组中。以下面的例子为例:

Class{public static function(...$args):{return new self(...$args);}public function(public string$name,public string$email,public int$age,){}}$data=CustomerData::new(email:';[email protected]';,age:25,name:';brent';brent';);

最后,命名参数将以实用的方式处理继承期间的名称更改。以此为例:

接口{PUBLIC Function($EVENT,$HANDLER);}类实现{PUBLIC Function($myEvent,$myHandler){//…。}}。

PHP将以静默方式允许将$event的名称更改为$myEvent,将$HANDLER更改为$myHandler;但如果您决定使用使用父名称的命名参数,则将导致运行时错误:

当所有继承的参数必须保持相同的名称时,选择这种实用的方法是为了防止重大的突破性更改。对我来说这似乎是个不错的解决方案。

这就是关于命名参数的最多信息。如果您想了解一些设计决策背后的更多背景故事,我建议您阅读RFC。

您是否期待使用命名参数?请通过推特或电子邮件通知我!