我们有一个巨大的代码库,在访问未定义的变量或数组键时,我们忽略了 php7 的通知。 例如
$somethingThatMayNotExist = $_REQUEST['somethingThatMayNotExist']
PHP8 现在会抛出错误。我知道我们应该始终检查键是否存在,或者变量是否已定义。但代码库太大了,我们的单元测试覆盖率很差,我宁愿切换到 php8 并将这些错误作为通知处理(并将值设置为 null)。 这可以使用某种自定义错误处理程序吗?如果是这样,该怎么做?
根据 @KikoSoftware 的评论,我通过创建自定义错误处理程序解决了这个问题,并通过记录和合并它们进行重构来忽略这些类型的错误。
set_error_handler(array($this,'handleError'))
public function handleError($code, $message, $file, $line)
{
if(str_contains($message, 'whatever errormessage should be ignored') {
// TODO: send mail or log error somewhere for further refactoring
return null; // php7.4-like behaviour
}
parent::handleError($code, $message, $file, $line);
}
我使用了这个正则表达式查找和替换:
$_REQUEST[(.+)]
($_REQUEST[$1] ?? "")
替换中没有外括号,html 在某些地方会变得混乱。
我使用 Linux Mint Software Manager 中的 Regexxer 来替换多个文件。 Notepadqq 中的正则表达式查找和替换无法正常工作。
这适用于拥有大量代码库的人,他们在迁移到更新/更安全/更快的 PHP 版本时受到限制,只是因为未定义的数组键或未定义的变量现在在 PHP 8 中成为警告。
为了抑制 PHP 8 中的未定义警告,我发现了两种主要方法:使用带有 PHP 扩展(一些 C 代码)的自定义错误处理程序或通过 php.ini 在 auto_prepend_file 中设置自定义错误处理程序(php 代码) .
通过这些调整运行代码,直到您有时间修复或重写庞大的代码库。
php8 在非 isset 数组键上创建异常。并且您可以创建全局钩子来处理此异常。