【问题标题】:Hiding deprecation warnings from a vendor-provided class only仅从供应商提供的类中隐藏弃用警告
【发布时间】:2013-11-21 02:59:50
【问题描述】:

我们有一个应用程序,其中包含一个非常古老的类,用于连接到专有数据库的 API。此代码会生成大量弃用错误,然后会被记录下来,从而污染我们的日志文件。

我们只想忽略这个供应商提供的类的弃用错误,但我很难找到最好的方法来做到这一点。我见过的选项:

使用@ 抑制警告。它看起来像this does not work for includes,仅适用于返回值的函数。

创建一个包含包含的包装脚本,并关闭包含语句之前的警告。作为ini_set acts globally,关闭所有弃用警告,这不是一个可行的解决方案。 p>

更新供应商提供的脚本。我们宁愿不走这条路,因为如果新版本无法完全解决这些错误,但会添加新功能,则需要额外的工作和维护,例如。

在我缺少的这个特定供应商库中禁用警告的任何其他选项?

【问题讨论】:

  • 你有没有试过把include放在一个函数里面,然后用@操作符调用这个函数?
  • 如果他们提供了一个不包括修复它的更新脚本,那么一开始就不值得更新它。老实说,我要么选择“自己修复错误”路线,要么选择“寻找新脚本”路线。把头埋在沙子里让你的错误消失几乎总是一个坏主意
  • 您可以ini_set 抑制供应商脚本顶部的错误,ini_set 在底部恢复正常...除非供应商提供的文件包含单独调用的类或函数从其他地方?
  • @SetSailMedia:根据问题它是一个数据库API类,所以几乎可以肯定只有在您开始调用方法之后才会出现弃用错误。
  • @EugenRieck 我们还没有,但会研究这样的解决方案(Jon 的回答,与你的类似)

标签: php


【解决方案1】:

您可以附加一个用户错误处理程序,以便在 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。原始建议可通过答案的编辑历史记录获得。选择你的毒药。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-21
    相关资源
    最近更新 更多