(转载)PHP 8.0 部分错误的解决办法 - 无主界 (Deprecated: Required parameter $xxx follows optional parameter $yyy )

好在大多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使JavaScriptobject_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,也拿出来说一说的原因。赶紧把一些历史遗留问题解决了把~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值