好在大多bug已经在PHP的官网得到了提出,要做的就是等待修复了。不过在遇到的众多bug中,有一些却并不是由于PHP本身造成的,比如接下来要说的两个较为隐蔽的错误。
PHP Warning
Warning: Only the first byte will be assigned to the string offset in /path/wp-includes/class.wp-scripts.php on line 492
其中一个错误如上所示,这个警告指向的是wp-includes/class.wp-scripts.php文件,这是WordPress的一个核心文件。一开始,我想很多小伙伴会和我一样认为是WordPress自己的错误,但是WordPress在5.6版本就已经宣布全面支持PHP 8了,所以这个问题不应该是WordPress核心文件有问题。
要想解决这个问题,我们需要把报错的相关代码拿出来看:
$l10n[ $key ] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8' );
上述代码,大家肯定和我一样看的莫名奇妙,感觉不到什么问题。但是如果结合它所在的function:
public function localize( $handle, $object_name, $l10n )
大家是不是猜到了,很可能是在使用wp_localize_script这个function时出现了问题,而问题的关键就在于参数$l10n。
我们不妨从官网资料中看一下$l10n到底是个什么东西:
$l10n (array) (Required) The data itself. The data can be either a single or multi-dimensional array.
原来,问题在于参数$l10n在函数wp_localize_script中接受到的应该是一个数组,如果没有接受到数组,只是接受到了字符串等非数组的值时,由于PHP 8的新特性,会报出一个警告。
解决办法
解决这问题其实相对简单,只需要在使用函数wp_localize_script:
wp_localize_script( string $handle, string $object_name, array $l10n )
把上面参数 l 10 n 改 为 数 组 即 可 。 但 是 需 要 注 意 修 改 后 的 使 用 , 比 如 此 函 数 的 作 用 可 为 J a v a S c r i p t 提 供 一 个 参 数 , 参 数 名 字 为 l10n改为数组即可。但是需要注意修改后的使用,比如此函数的作用可为JavaScript提供一个参数,参数名字为 l10n改为数组即可。但是需要注意修改后的使用,比如此函数的作用可为JavaScript提供一个参数,参数名字为object_name。在函数修改后,参数$object_name将在JavaScript中成为一个对象。
PHP Deprecated
Deprecated: Required parameter $xxx follows optional parameter $yyy in…
这类报错在升级PHP 8后也非常常见。这类错误多是来自一些主题或者是插件。其实这类的错误早就存在多年,但是一直未受到太多重视,最终在PHP 8的时候变成了Deprecated报错。
以下是出现错误代码:
function xxxxx( $avatar, $id_or_email, $size=30, $default, $alt )
其实出现的问题很简单,错误的点就在$size=30这个参数。由于PHP规定,在可选参数中,若有默认值的参数不在最后一个,将会直接忽视它的默认值。所以这样写根本没必要,直接把默认值删除即可:
function xxxxx( $avatar, $id_or_email, $size, $default, $alt )
也许有人会担心是不是会导致一些问题,这大可不必。因为这个问题在PHP 8之前就存在,只是没有报错而已。这次PHP 8特地报了个Deprecated来解决这种不严谨的使用。当然,这也是为什么虽然只是个Deprecated,也拿出来说一说的原因。赶紧把一些历史遗留问题解决了把~