PHP, Vererbung und __sleep()

Hi,

heute bin ich mal wieder auf einen interessanten und zugleich ärgerlichen Bug gestoßen. Versucht man Eigenschaften einer Klasse zu serialisieren, die in der Vater-Klasse als private deklariert sind, spielt PHP leider nicht mit.

Zumindest dann nicht, wenn man die Methode __sleep() implementiert. Lässt man diese weg, liefert PHP das erwartete Ergebnis zurück.

Der „Fehler“ ist schon lange bekannt, aber leider immer noch nicht gefixt. Stattdessen verweisen die Entwickler auf das Interface Serializable und behaupten, dies sei kein Bug

http://bugs.php.net/bug.php?id=36172

Ich finde, das ist sehr wohl ein Bug…

Es gibt noch einen weiteren Workaround für dieses Problem, den man in den Kommentaren in der Dokumentation findet.

http://de2.php.net/manual/en/language.oop5.magic.php#81492

class A {
  private $foo;

  function __sleep(){
    return array("\0A\0foo");
  }
}

class B extends A {
}

// Liefert nun das richtige Ergebnis
unserialize(serialize(new B()));

Somit lassen sich auch private Eigenschaften der Vaterklasse serialisieren.