微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处理 PHP8

如何解决处理 PHP8

由于 PHP8 将 Undefined array key notice 升级为警告,我遇到了错误日志泛滥的问题,因为我们的遗留代码是以依赖于 PHP 的隐式真/假的方式编写的。

例如

if ($_POST['submit']) { ... } else { ... }
<input value="<?=$this_page['id']?>"> # in a shared add/edit form

以前我很乐意抑制 E_NOTICE,但我不准备用 E_WARNING 这样做。

我知道最好的解决方案是重构代码以利用包装器/抽象类与超全局变量进行交互并使用基于对象的模型来处理数据库对象。不幸的是,我有 100 多个遗留应用程序在 6 个月内使 PHP8 兼容,因此主要重构不在范围内。

我尝试过使用 ArrayObject,它可以通过重载 offsetGet/Set 来解决一些问题,但这会破坏与 array_* 函数的兼容性并产生与第三方包的潜在问题。

我想知道是否有人已经为此开发了解决方法,或者有任何关于减少替代品的想法。除了主要重构或关闭项目之外,我几乎对任何想法都持开放态度!搜索/替换、项目特定配置、服务器级配置、polyfills,我在那里。

解决方法

如果您愿意进行一些查找和替换,那么有一些结构可以保证相同的行为,但没有警告。

最通用的是 the ?? null coalescing operator,它允许您将未设置的数组键转换为显式空值:

if ($_POST['submit']??null) { ... } else { ... }
<input value="<?=$this_page['id']??null?>"> 

更合乎逻辑的是,echo 语句中的默认值是一个空字符串:

<input value="<?=$this_page['id']??''?>"> 

if 语句中的逻辑默认值是布尔值 false,但可能更易读的是 the empty pseudo-function

if (! empty($_POST['submit'])) { ... } else { ... }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。