【问题标题】:Upgrading from PHP7.4 => PHP8, is it possible to ignore certain errors从 PHP7.4 => PHP8 升级,是否可以忽略某些错误
【发布时间】:2021-11-18 10:24:17
【问题描述】:

我们有一个庞大的代码库,当访问未定义的变量或数组键时,我们忽略了来自 php7 的通知。 例如

$somethingThatMayNotExist = $_REQUEST['somethingThatMayNotExist']

PHP8 现在抛出错误。我知道我们应该始终检查密钥是否存在,或者变量是否已定义。但是代码库太大了,我们的单元测试覆盖率很差,我宁愿切换到 php8 并将这些错误作为通知处理(并将值设置为 null)。 这是否可以使用某种自定义错误处理程序?如果有,该怎么做?

【问题讨论】:

  • 只需在$_REQUEST['....'] 后面添加?? NULL 即可消除PHP 8 中的错误。无论如何,忽略通知绝不是一个好主意。
  • @KIKOSoftware 我知道,但找到所有问题也是一项非常耗时的任务,我们不能确定是否找到了所有问题(不仅在 $_REQUEST 变量上)
  • 我也遇到过类似的问题,我解决它的方法是。 1. 检查日志文件并检查我可以在那里找到的所有通知。 2. 让所有新的通知和错误通过电子邮件发送给我,并在它们发生时立即解决。现在我的代码库完全没有错误,而且没有那么耗时。大多数错误都是非常基本的。
  • 好主意。我们已经有一个错误处理程序,可以发送有关严重错误的邮件。我现在将忽略这些错误并将它们记录到一个特定的位置,我们可以根据发生情况对其进行重构。
  • 您可以使用正则表达式搜索和替换,或sed 使用正则表达式搜索和替换,将所有行替换为更新版本。不管代码库有多大;)

标签: php error-handling


【解决方案1】:

根据@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);
}

【讨论】:

    【解决方案2】:

    我用这个正则表达式查找和替换:

    $_REQUEST[(.+)]

    ($_REQUEST[$1] ?? "")

    如果没有替换中的外括号,html 会在某些地方搞砸。

    我使用 Linux Mint 软件管理器中的 Regexxer 来替换多个文件。 Notepadqq 中的正则表达式查找和替换无法正常工作。

    【讨论】:

      【解决方案3】:

      php8 在非 isset 数组键上创建异常。并且您可能会创建全局挂钩来处理此异常。

      【讨论】:

      • 这是个坏建议。首先,您没有向我们展示如何做到这一点,但其次,您没有警告这样做的人可能会错过有用的错误消息。
      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 2012-12-22
      • 2017-04-19
      • 1970-01-01
      • 2015-06-26
      • 2013-11-18
      • 2016-11-10
      相关资源
      最近更新 更多