提问人:miken32 提问时间:12/15/2020 最后编辑:miken32 更新时间:11/1/2023 访问量:79151
可选参数$yyy后面$xxx必需参数
Required parameter $xxx follows optional parameter $yyy
问:
Deprecated: Required parameter $xxx follows optional parameter $yyy in...
自从升级到 PHP 8.0 以来,在运行如下代码时会抛出此错误:
function test_function(int $var1 = 2, int $var2) {
return $var1 / $var2;
}
这在以前的PHP版本中一直有效,没有问题。
答:
这种函数声明方式在 PHP 8.0 中已被弃用。编写这样的函数从来就没有意义,因为在调用函数时需要指定所有参数(直到最后一个必需的参数)。它还导致使用 ReflectionFunctionAbstract
类来分析函数和方法的混淆。
新的弃用只是确保函数签名遵循常识性假设,即必须出现的必需参数应始终在可选参数之前声明。
应重写该函数以删除前面参数的默认值。由于在不声明所有参数的情况下永远无法调用该函数,因此这应该不会影响其功能。
function test_function(int $var1, int $var2) {
return $var1 / $var2;
}
评论
func(param1: "value1", param2: "value2")
没有默认值的必需参数应排在最前面。
function test_function(int $xxx, int $yyy = 2)
{
return $xxx * $yyy;
}
评论
“如果具有默认值的参数后跟必需的参数,则默认值不起作用。”
从 PHP 8.0.0 开始,这已被弃用,通常可以解决
- 通过删除默认值
- 通过如上所述更改参数的位置
,而不更改功能。
这种方法在我的情况下有效=)
我面临以下错误:
ErrorException 必需参数$id遵循可选参数$getLink
以下代码生成了此异常
public function fo($getLink = null , $id)
{ ......
}
为了解决这个错误,我按照以下代码中的建议更改了参数的位置:
public function fo($id, getLink = null)
{ ......
}
完成 =)
评论
对我来说效果很好的解决方案是交换参数的位置,确保默认值设置为 null 的任何参数之后都没有参数。
如果有人试图找到一种方法来发现需要更新的函数,您可以通过 grep 在 linux 中使用此正则表达式,它将结果输出到名为 results.txt 的文件。它只会在 .php 文件中搜索。
我花了一段时间才让它工作,它可能需要更多的调整!
flag -i = Case insensitive search
flag -n = print line number match was found on with the file found
flag -r = recursive from current location downwards
flag -E = Use extended regular expression rules
grep -irnE --include \*.php 'function ([a-zA-Z0-9_]*?)[ ]?\(.*?\$[a-zA-Z0-9_]*?=.*?(\$[a-zA-Z0-9_]*?)[\),]{1}[^\{]*?' > results.txt
希望这对任何试图查找和纠正错误的人有所帮助。
评论
*?
+
.*?
.*
\$[a-zA-Z0-9_]*
{1}
我在 8.0 以上的 PHP 版本中遇到了这个问题。 在我的情况下,我设法通过转换回 PHP 版本 7.4 来解决这个问题。
评论
function test_function(int $var1 = 2, int $var2=0)
$var2