2017-01-16 3 views
4

Unser jahrelanger PHP-Code hat die Exception-Behandlung stark genutzt, indem traditionelle Fehler über set_error_handler() und set_exception_handler() in Exceptions umgewandelt wurden. Nach der Migration so zu PHP 7 für einige unserer Server Störungen begann Pumpen:PHP 7 Fehlerobjekt in Exception konvertieren?

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

Wir \ Throwable als Typ Hinweis verwenden, können aber die meisten unserer Codebasen sind immer noch auf PHP 5-Servern.

Gibt es eine Möglichkeit, ein Fehler-Objekt hier einfach in ein Exception-Objekt umzuwandeln?

+0

upgraden Sie Ihre Server, oder downgraden Sie Ihre PHP-Version – samayo

Antwort

4

Sie können den Typhinweis aus der Definition der Methode löschen und get_class() oder instanceof verwenden, um zu entscheiden, was zu tun ist.

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

Aber sind Fehler-Objekte und Exception-Objekte in Bezug auf die Schnittstelle austauschbar? Gleiche Methoden und Eigenschaften? –

+1

Ja, beide implementieren \ Throwable, nur dass in PHP7 Sie keine Fehler bekommen, Sie erhalten nur Fehler Objekte: http://php.net/manual/en/class.error.php && http://php.net /manual/en/class.exception.php – motanelu

+0

Tatsächlich ist '\ Throwable' die neue Basisklasse für Ausnahmen. – Andrea