【问题标题】:Required parameter $xxx follows optional parameter $yyy必需参数 $xxx 跟在可选参数 $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之前。
  • 这个问题已经有了答案。按照你的建议去做意味着在你的代码库中重写你的函数的每次使用。

标签: php function-signature php-8


【解决方案1】:

这种风格的函数声明has been deprecated in PHP 8.0。像这样编写函数有never made sense,因为在调用函数时需要指定所有参数(直到最后一个必需的参数)。它还caused confusionReflectionFunctionAbstract 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;
}
 

【讨论】:

  • 然后在整个代码中更新该方法的每次使用?
  • 我认为您不必这样做,除非它会引发错误。
  • 无默认值的必填参数应在前
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 2023-03-10
  • 2017-06-14
  • 2014-08-02
  • 1970-01-01
相关资源
最近更新 更多