处理 PHP8 中的"未定义数组键"警告



由于PHP8将未定义数组键通知升级为警告,我遇到了错误日志被淹没的问题,因为我们的遗留代码是以依赖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,我在那里。

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

最通用的是??null合并运算符,它允许您将未设置的数组键转换为显式null:

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

从逻辑上讲,echo语句中的默认值是一个空字符串:

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

if语句中的逻辑默认值是布尔false,但可能更可读的是empty伪函数:

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

最新更新