【问题标题】:Point ob_start to a function inside a class to capture fatal errors将 ob_start 指向类内的函数以捕获致命错误
【发布时间】:2009-09-01 12:02:51
【问题描述】:

我正在尝试在 PHP 中创建一个通用类,它将提供一种调用 Web 服务、解析返回的 XML 并返回 JSON 对象的方法。

我在不支持 CURL 和/或 JSON 的服务器上遇到了致命错误,并寻找一种方法来优雅地将 JSON 对象中的错误返回给客户端,而不是崩溃。
经过一番搜索,我找到了一篇文章这表明我可以调用ob_start("fatal_error_handler") 并提供一个处理函数:

function fatal_error_handler($buffer) {
    if (ereg("(error</b>:)(.+)(<br)", $buffer, $regs) ) {
        $err = preg_replace("/<.*?>/","",$regs[2]);
        $buffer = json_encode(array("errorMessage" => "Fatal error occurred", "exceptionMessage" => $err));
    }
    return $buffer;
} 

并在脚本末尾调用ob_end_flush
效果很好,但我现在想将该功能添加到我的课程中。我尝试并成功添加了以下构造函数和析构函数:

    function __construct() {
        ob_start("fatal_error_handler");
    }

    function __destruct() {
        ob_end_flush();
    }

但是当我尝试将处理函数移到类中时,我无法将它添加到 ob_start() 调用中。我尝试了ob_start("$this-&gt;fatal_error_handler")ob_start("WebService::fatal_error_handler")(WebService 是我的班级名称) - 无济于事。

我的问题是,如何将类函数的名称传递给包含在构造函数中的ob_start

一个额外的问题:我这样做是否正确,或者是否有更好的方法以客户端可以处理的方式处理致命错误?

【问题讨论】:

标签: php fatal-error


【解决方案1】:
ob_start(array($this, 'fatal_error_handler'));

【讨论】:

  • 谢谢!!!但是,这只有在处理函数被标记为公共的情况下才有效(绝对没有受保护或私有的输出)。我想知道有没有办法解决这个问题?
  • 不确定这是否有效,但您可以尝试通过引用传递 $this,即:ob_start(array(&$this, 'fatal_error_handler'));
  • @TTG:由于fatal_error_handler 是从类外部调用的,所以在 PHP 5.3 之前我们无法绕过它来尊重可见性,那时我们使用 lambdas 获得闭包。为什么错误处理程序是私有的/受保护的?
  • 我希望它是私有的(即外部世界无法访问),但现在我必须将其公开:(
猜你喜欢
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2018-09-10
  • 2015-09-28
  • 2016-10-28
  • 2018-09-06
  • 2019-08-09
相关资源
最近更新 更多