2017-01-16 5 views
4

Наши годы PHP-кода в значительной степени использовали обработку исключений путем преобразования традиционных ошибок в исключения с помощью set_error_handler() и set_exception_handler(). После перехода на PHP 7 для некоторых из наших серверов ошибки, как это начали откачку:Преобразование PHP 7 Ошибка объекта исключения?

Uncaught TypeError: Argument 1 passed to DataStellar\General\Exception_Handler::getContext() must be an instance of Exception, instance of Error given 

Мы можем использовать \ Throwable как тип подсказку, но большинство наших кодовых баз еще на PHP 5 серверов.

Можно ли легко преобразовать объект Error в объект Exception здесь?

+0

обновите свои серверы или обновите версию php – samayo

ответ

4

Вы можете отказаться от типа намекания из определения метода и использовать get_class() или instanceof, чтобы решить, что делать.

class Exception_Handler 
{ 
    public static function getContext($error) 
    { 
     if (class_exists('\\Error') && $error instanceof \Error) { 
      // PHP 7 Error class 
      // handle and return 
     } 

     if ($error instanceof \Exception) { 
      // PHP Exception class (user exception in PHP7) 
      // handle and return 
     } 

     // weird edge case 
    } 
} 
+0

Но являются ли объекты Error и объекты Exception взаимозаменяемыми с точки зрения интерфейса? Те же методы и свойства? –

+1

Да, оба реализуют \ Throwable, только в PHP7 вы не получаете ошибок, вы просто получаете объекты Error: http://php.net/manual/en/class.error.php && http://php.net /manual/en/class.exception.php – motanelu

+0

Фактически, '\ Throwable' - это новый базовый класс исключений. – Andrea