由于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 { ... }