近期把服务器的php版本从7.4升级到了8.1,网站响应速度终于快了那么一丢丢(可能是心理作用吧)。但因为php8的语法要求更加严格,所以升级过程中,在多个站点里,发现了N多报错。
1、Warning: Undefined array key "xxxxxxx" in ....
这个错误是我在升级过程中遇到的最多的错误之一。如果你的代码中使用了未定义的数组键值,那么会抛出 Undefined array key
错误。这是因为在 PHP 8 中,增加了对未定义的数组键值的严格检查,所以如果访问一个未定义的数组键值,PHP 会抛出一个警告或致命错误。
这个错误通常会在使用数组时出现,例如:
$array = [];
echo $array['key']; //这里的键'key'就是一个未被定义的key
出现这个错误的解决方法是在访问数组元素之前检查它是否已经定义。可以使用 isset()
函数或 Null 合并运算符(??
)来避免该错误。
例如,将下面的代码:
if ($dami_meta['std'] != '') {
echo '<img src="'.$dami_meta['std'].'" />';
}
修改为:
if (isset($dami_meta['std']) && $dami_meta['std'] != '') {
echo '<img src="'.$dami_meta['std'].'" />';
}
或者使用 Null 合并运算符:
echo '<img src="'.($dami_meta['std'] ?? '').'" />';
这样可以避免出现 Undefined array key
错误。
2、Fatal error: Uncaught Error: Call to undefined function create_function()
由于在wordpress中,一些插件、主题使用了create_function()函数。这个函数在 PHP 7.2 版本中就已经被废弃并且在 PHP 8.0 中被移除。你可以使用匿名函数来代替 create_function()
。例如,如果你原来的代码是这样的:
$myFunction = create_function('$arg1, $arg2', 'return $arg1 + $arg2;');
$result = $myFunction(1, 2);
可以将其修改为:
$myFunction = function ($arg1, $arg2) { return $arg1 + $arg2; };
$result = $myFunction(1, 2);
再比如原来代码如果是:
add_action('widgets_init', create_function('', 'return register_widget("imsail_comment");'));
可以将其修改为:
add_action('widgets_init', function() {
return register_widget("imsail_comment");
});
除了上面这两个最常见的错误之外,ChatGpt还总结出了一些常见的报错信息及解决方案,仅供参考:
3、Fatal error: Array and string offset access syntax with curly braces is no longer supported
这是由于在 PHP 8.1 中,花括号 {} 不能再用于字符串和数组的下标访问,必须使用方括号 []。可以使用 IDE 工具搜索这些语法,然后手动更改。
4、Warning: implode(): Passing glue string after array is deprecated
在 PHP 8.1 中,implode() 函数的参数顺序发生了变化,现在应该先传递分隔符字符串,然后是数组,而不是数组在前。例如,使用 implode('-', $array) 代替 implode($array, '-')。
5、Deprecated: Required parameter $foo follows optional parameter $bar
在 PHP 8.1 中,函数和方法定义不允许在必需参数之后使用可选参数。可以通过将必需参数移到可选参数之前来解决此问题。
6、Fatal error: Unparenthesized a ? b : c ? d : e
is not supported
在 PHP 8.1 中,三元运算符的优先级发生了变化。如果在三元运算符中嵌套另一个三元运算符,需要加上括号来确保正确的优先级。例如,使用 (a ? b : c) ? d : e 代替 a ? b : c ? d : e。
7、Fatal error: Cannot use object
as class name as it is reserved
在 PHP 8.1 中,object
已成为保留关键字,不能再用作类名、属性名或方法名。可以将类重命名为其他名称,例如 MyObject
。
8、Fatal error: Constructor Myclass::__construct() cannot declare a return type
在 PHP 8.1 中,构造函数不允许声明返回类型,因为它们总是返回一个新的对象实例。可以通过删除构造函数的返回类型声明来解决此问题。
9、Deprecated: Required parameter $arg follows optional parameter $opt
在 PHP 8.1 中,函数和方法定义不允许在必需参数之后使用可选参数。可以通过将必需参数移到可选参数之前来解决此问题。
10、Deprecated: Array and string offset access syntax with curly braces is deprecated
在 PHP 8.1 中,花括号 {} 不能再用于字符串和数组的下标访问,必须使用方括号 []。可以使用 IDE 工具搜索这些语法,然后手动更改。
这些是 PHP 7.4 升级到 8.1 可能遇到的一些常见问题和错误。为了确保代码在 PHP 8.1 中正常工作,需要仔细检查代码,对代码进行全面的测试和更新,解决其中的错误和警告。在升级之前,建议先备份代码和数据,以便在需要时进行恢复。
此外,除了上述问题,在wordpress中也存在着不少的报错信息。肥牛在这里也整理了一些常见的问题及修复方法,有兴趣的小伙伴可以点此查看《php升级8.1后wordpress主题/插件常见报错及处理方案》这篇文章。