So, nachdem ich einige Wochen unterwegs war, Timi mit dem Blog alleine gelassen habe und mal eine Runde Abstand vom programmieren hatte, komme ich zurück, aktualisiere meine PHP Installation auf die neueste Version, starte mein Projekt und: BUMM, nichts geht mehr. Meine Sessions scheinen Variablen zu verlieren, Objekte sind nicht mehr komplett, bzw. leer. Was ist da los? Habe ich mein Projekt mit einem Riesenbug stehen lassen und bin in Urlaub gefahren?
Also gut, Suche beginnt.
Session scheint ok zu sein. Nur die Objekte sind irgendwie verstümmelt. Aber der Reihe nach. Ich programmiere seit einer Weile in PHP5 und versuche auch eine sinnvolle Klassenstruktur zu wahren. Jedenfalls habe ich sowas wie die Mutter aller Objekte, von denen sich sämtliche Klassen ableiten. In diesem Objekt habe ich eine Funktion __sleep, was eine Magic Function ist, die beim schreiben in die Session von PHP aufgerufen wird, um im Objekt aufzuräumen und meine CFG Referenz, in der unter anderem DB Connection etc. liegt nicht zu serialisieren.
public function __sleep()
{
$vars = array_keys(get_object_vars($this));
$cfg = array_search('cfg', $vars);
unset($vars[$cfg]);
return $vars;
}
Nach einigen Tests fand ich dann, dass die Funktion get_object_vars nicht mehr wie vorher alle Variablen des Objektes liefert, sondern nur noch alles was public deklariert ist. Dies wird aber nicht weiter erwähnt im Changelog, genauso wenig in der Doku auf der Funktionsseite. Jedenfalls ist mein Verständnis von Objekten dahingehend, dass ich als ein Kindobjekt diese __sleep Funktion aufrufe, dass ich gefälligst alle Variablen bekommen soll, die dieses Objekt hat und nicht nur die, die vom Scope des Parent, also meiner abstrakten Klasse sichtbaren, bekomme.
Jedenfalls habe ich schön in der Bug Datenbank recherchiert, bevor ich diesen Code verschickt habe.
Nun meine Frage: Was ist für euch das erwartete Verhalten von dem verlinkten Code? Habe ich das falsch verstanden und werde jetzt brav meine ganzen Variablen alle nur als protected deklarieren, damit ich eine generelle __sleep Funktion haben kann, bzw. per Reflection meine gesetzen Klassenvariablen bekommen kann?

















