php 仅隐藏来自供应商提供的类的弃用警告

ruarlubt  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(111)

我们有一个应用程序,其中包括一个非常非常古老的类,用于连接到专有数据库的API。这段代码生成了大量的弃用错误,然后被记录下来,污染了我们的日志文件。
我们希望基本上只忽略这个供应商提供的类的弃用错误,但我在寻找最佳方法时遇到了麻烦。我看到的选项:

**使用@抑制警告。**它看起来像this does not work for includes,仅适用于返回值的函数。
**创建一个包含include的 Package 脚本,并关闭include语句之前的警告。**作为ini_set acts globally,关闭所有弃用警告,这不是一个可行的解决方案。
**更新供应商提供的脚本。**我们宁愿不走这条路,考虑到额外的工作和维护,如果一个新版本到达,不完全解决这些错误,但增加了新的功能,例如。

有没有其他选项可以禁用我缺少的这个特定供应商库中的警告?

4uqofj5v

4uqofj5v1#

您可以附加一个用户错误处理程序,以便在PHP看到错误之前将其处理掉。这个处理程序只会在错误库的源代码中生成错误时进行干预。举例来说:

class SingleSourceFileErrorSuppressor
{
    private $_file;

    public function __construct($file)
    {
        $this->_file = $file;
    }

    public function handleError($errno, $message, $file)
    {
        if ($file !== $this->file) return false;
    }
}

你可以像这样使用这个类:

$naughtyLibrary = realpath('naughty.class.php');
$suppressor = new SingleSourceFileErrorSuppressor($naughtyLibrary);
set_error_handler([$suppressor, 'handleError'], E_DEPRECATED);
require($naughtyLibrary);
  • 更新:我决定修改供应商的库源代码不是最好的主意,即使是微不足道的修改,因为你必须记住维护它们,所以改变了建议的安装过程。新程序有一个不同的缺点:它不会自动搜索include_path原始建议可通过答案的编辑历史记录获得。选择你的毒药。*
4sup72z8

4sup72z82#

您可以附加错误处理程序,以防止/vendor/目录报告错误,或者仅附加单个库。

set_error_handler(
  function($code, $error, $file) {
    return str_contains($file, '/vendor/');
  },
  E_DEPRECATED);

这个代码片段假设我们需要跳过的弃用都在/vendor/目录中。
当回调函数返回false时,PHP将回退到正常的方式处理错误。如果回调函数返回true,PHP会认为我们已经自己处理了错误,不再做进一步的处理。

相关问题