Укажите ob_start на функцию внутри класса, чтобы зафиксировать фатальные ошибки - PullRequest
2 голосов
/ 01 сентября 2009

Я пытаюсь создать универсальный класс в PHP, который предоставит способ для вызова веб-службы, анализа возвращаемого 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->fatal_error_handler") и ob_start("WebService::fatal_error_handler") (имя моего класса - WebService) - безрезультатно.

У меня вопрос, как передать имя функции класса ob_start, включенному в мой конструктор?

Бонусный вопрос: правильно ли я это делаю, или есть лучший способ справиться с фатальными ошибками так, как может обрабатывать клиент?

1 Ответ

5 голосов
/ 01 сентября 2009
ob_start(array($this, 'fatal_error_handler'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...