必需参数 $xxx 跟在可选参数 $yyy 之后

Posted

技术标签:

【中文标题】必需参数 $xxx 跟在可选参数 $yyy 之后【英文标题】:Required parameter $xxx follows optional parameter $yyy 【发布时间】:2021-03-25 13:55:31 【问题描述】:
Deprecated: Required parameter $xxx follows optional parameter $yyy in...

自从升级到 php 8.0 后,运行如下代码时会抛出此错误:

function test_function(int $var1 = 2, int $var2) 
    return $var1 / $var2;

这在过去的 PHP 版本中可以正常工作。

【问题讨论】:

改变参数的顺序,将$xxx放在可选参数$yyy之前。 这个问题已经有了答案。按照你的建议去做意味着在你的代码库中重写你的函数的每次使用。 【参考方案1】:

这种风格的函数声明has been deprecated in PHP 8.0。像这样编写函数有never made sense,因为在调用函数时需要指定所有参数(直到最后一个必需的参数)。它还caused confusion与ReflectionFunctionAbstract class一起使用来分析函数和方法。

新的弃用只是确保函数签名遵循常识假设,即必须出现的必需参数应始终在可选参数之前声明。

应该重写该函数以删除早期参数的默认值。由于在不声明所有参数的情况下永远无法调用该函数,因此这应该不会影响其功能。

function test_function(int $var1, int $var2) 
    return $var1 / $var2;

【讨论】:

"因为调用函数时需要指定所有参数(直到最后一个必需的参数)"。我不同意3v4l.org/Nb6i6 ;) 非常令人印象深刻的吹毛求疵! ?? “编写这样的函数从来没有意义” - 我不同意。出于理智或可读性的原因,在某些情况下,参数的排序可能会有所不同。这种弃用似乎是不必要且令人讨厌的更改。 @Enverex 在这种情况下指定的默认值永远不会被使用,所以它没有任何用处。我从事 PHP 专业编程已经超过 15 年,而且我从来不需要这样做。参数顺序和默认值不打算用作文档,这就是 PHPDoc 的用途。 @Rain - 我也不同意。我的 2 美分... PHP8 的弃用根本没有经过深思熟虑。在 PHP8 中,他们添加了命名参数,这意味着您现在可以按任何顺序调用参数,只要您像这样按名称调用它们:func(param1: "value1", param2: "value2") 因此,该语法补充了能够以任何顺序为任何参数指定默认值。 @miken32 - 你说“因为在调用函数时需要指定所有参数(直到最后一个必需的参数)” - 这不再是真的【参考方案2】:

没有默认值的必需参数应该放在第一位。

function test_function(int $xxx, int $yyy = 2)

    return $xxx * $yyy;

 

【讨论】:

然后在整个代码中更新该方法的每次使用? 我认为您不必这样做,除非它会引发错误。 无默认值的必填参数应在前

以上是关于必需参数 $xxx 跟在可选参数 $yyy 之后的主要内容,如果未能解决你的问题,请参考以下文章

Dart 知识点:可选参数必需参数

必需参数 $path 遵循可选参数 $handlers paypal sdk [重复]

当目的地的必需参数来自可选状态变量时的 NavigationLink

Argparse:“可选参数”下列出的必需参数?

Dart语法之可选参数

我如何使自己的JavaScript函数具有必需的参数?