在 PHP 7.4 中报错:Cannot redeclare getFirstSkuIndex() 的解决,设置为静态匿名函数,且赋值给变量

1、在 PHP 7.4 中报错:Cannot redeclare getFirstSkuIndex()。表示函数 getFirstSkuIndex() 已被定义。PHP不支持重定义已声明的函数。如图1

图1

[2023-01-09 10:28:00] local.ERROR: Cannot redeclare getFirstSkuIndex() (previously declared in E:\wwwroot\object\storage\framework\views\f7c14c1d27c4ea3f4d0e1c60a5009bfe9a47c438.php:7) {
    "exception": "[object] (Symfony\\Component\\Debug\\Exception\\FatalErrorException(code: 64): Cannot redeclare getFirstSkuIndex() (previously declared in E:\\wwwroot\\object\\storage\\framework\\views\\f7c14c1d27c4ea3f4d0e1c60a5009bfe9a47c438.php:7) at E:\\wwwroot\\object\\storage\\framework\\views\\f7c14c1d27c4ea3f4d0e1c60a5009bfe9a47c438.php:7)
[stacktrace]
#0 {main}
"
} 

2、参考:https://www.shuijingwanwq.com/2022/11/14/7149/ ,现在是因为同一个文件被重复引入(业务上允许重新引入)。进而导致同一个函数被重复定义。

3、查看被引入文件的代码实现


function getFirstSkuIndex ($product) {
  // ...
}

return getFirstSkuIndex($product);

4、将函数声明为闭包函数,然后赋值给变量,PHP 会自动把此种表达式转换成内置类 Closure 的对象实例。且设置为静态匿名函数。编辑后的被引入文件的代码实现,在重新执行引入的重复文件时,函数 $getFirstSkuIndex 会简单地覆盖之前的声明。不再报错。


$getFirstSkuIndex = static function ($product) {
  // ...
};

return $getFirstSkuIndex($product);
永夜