1. PHP5 Tipp: Serialisierte Objekte in Exceptions

    Stefan · 28.10.08, 18:13 Uhr · Allgemeines, PHP, Programmierstil · Tags: , ,

    Wenn man in PHP5 ordentlich programmiert, dann tut man das in der Regel Objektorientiert und wirft bei Fehlern auch aussagekräftige Exceptions, um spätere Fehlerbehandlungen einfacher zu gestalten.

    In einem meiner derzeitigen Projekte übergebe ich als Hilfsmittel hauptsächlich zum Debuggen in der Exception Message auch das serialisierte Objekt, das den Fehler verursacht hat. Solange man nur public Properties im Objekt hat, ist das auch alles kein Problem. Gestutzt hatte ich als die Exception geworfen wurde und mein serialisiertes Objekt einfach nur zur Hälfte in der Message stand. Schuld war der Geltungsbereich von Properties. Eine als private oder protected deklarierte Eigenschaft wird serialisiert mit folgenden Flags gekennzeichnet: ' . "\0" . ' oder ' . "\0" . '*' . "\0" . '. Und genau das scheinen die Exceptions nicht zu mögen.

    Folgendes Testobjekt

    class Test {
        protected $_property = array(
            'id' => 12,
            'content' => 'test'
        );
    }

    erzeugt folgende Ausgabe in der Serialisierung:

    'O:4:"Test":1:{s:12:"' . "\0" . '*' . "\0" . '_property";a:2:{s:2:"id";i:12;s:7:"content";s:4:"test";}}'

    Das Ganze jetzt in einer Exception gethrowt kam bei mir so an:

    O:4:"Test":1:{s:12:"

    Lösung des Ganzen: Beim Throwen einer Exception statt einem serialize($object) noch zusätzlich ein var_export drumherum setzen, dann klappt das auch mit der Exception:

    throw new Exception(var_export(serialize($object), true));
  2. Kommentar schreiben

    XHTML: Du kannst diese Tags nutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Gehe zur polyCODER Startseite