由于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,我都在这里。
发布于 2021-05-16 01:10:31
如果你乐于做一些查找和替换,有一些构造可以保证相同的行为,但没有警告。
最通用的是the ??
null coalescing operator,它允许您将未设置的数组键转换为显式null:
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 { ... }
https://stackoverflow.com/questions/67543569
复制相似问题