Класс не найден из закрытия
Это мое ErrorHandler
класс, я регистрирую обработчики из основного Application
вызов класса ErrorHandler::init();
Я не понимаю почему, но класс ErrorResponse
не найден в set_error_handler
а также set_exception_handler
,
Однако класс находится в register_shutdown_function
... это довольно странно.
Не могли бы вы знать, что может быть причиной того, что ErrorResponse
класс не найден в других обработчиках?
<?php
namespace tools\exception;
use tools\core\http\ErrorResponse;
class ErrorHandler
{
static public function init()
{
self::_registerNormalErrorHandler();
self::_registerExceptionErrorHandler();
self::_registerFatalErrorHandler();
}
static private function _registerNormalErrorHandler()
{
set_error_handler(function ($err_code, $err_message, $err_file, $err_line)
{
$responseCode = 500;
ErrorResponse::create(
$responseCode,
$err_file,
$err_message,
$err_line,
"set_error_handler")->sendJSON();
die();
});
}
static private function _registerExceptionErrorHandler()
{
set_exception_handler(function ($exception)
{
$responseCode = $exception->getCode();
if(0 === $responseCode)
$responseCode = 500;
ErrorResponse::create(
$responseCode,
$exception->getFile(),
$exception->getMessage(),
$exception->getLine(),
"set_exception_handler")->sendJSON();
die();
});
}
static private function _registerFatalErrorHandler()
{
register_shutdown_function(function ()
{
$last_error = error_get_last();
if( null !== $last_error ) {
$isError = false;
switch ($last_error["type"]) {
// ...
}
if($isError) {
ErrorResponse::create(
500,
$last_error['file'],
$last_error['message'],
$last_error['line'],
$caught)->sendJSON();
}
}
});
}
}
1 ответ
Я исправил это:D, проблема заключалась в том, что принцип подстановки Лискова приводил к тому, что класс не обнаружил ошибку... Я нашел объявление совместимости... (обычная ошибка, которую вы получаете, когда не соблюдаете принцип подстановки Лискова) в какой-то журнал.
ErrorResponse является дочерним по отношению к классу Response, и у обоих был фабричный метод с именем create()
создать их экземпляр. Я удалил фабричный метод на ErrorResponse
и я создаю его экземпляр обычным способом new ErrorResponse( ... )