Objekte existieren nur zur Laufzeit, können aber durch die Speicherung ihres Zustandes persistent (dauerhaft) gemacht werden. Sie können somit gespeichert und zu einem späteren Zeitpunkt wieder geladen werden. Die Speicherung eines Objektes und seines Zustands wird auch Serialisierung genannt.
PHP bietet die Funktionen serialize() und
unserialize(), um ein Objekt zu serialisieren beziehungsweise
aus der serialisierten Form wieder ein Objekt zu erstellen. Hierbei erzeugt
serialize() aus einem Objekt einen String, in dem die
relevanten Daten kodiert sind. Dieser String kann dann beispielsweise in
eine Datei geschrieben oder in einer Datenbank abgelegt werden. Analog
erwartet unserialize() einen String in diesem Format,
um ein Objekt aus dem kodierten String wiederherzustellen.
Verfügt die Klasse des Objektes, das serialisiert werden soll, über eine
__sleep-Methode, so wird diese automatisch vor der
eigentlichen Serialisierung auf dem Objekt aufgerufen. Diese Methode muss
ein Array mit den Namen derjenigen Instanzvariablen zurückliefern, die
serialisiert werden sollen. So kann die __sleep-Methode
einer Klasse, die eine Datenbankverbindung kapselt, beispielsweise Sorge
dafür tragen, dass nur die für den Verbindungsaufbau nötigen Parameter
gespeichert werden, nicht aber die Ressource-ID der aktuell bestehenden
Verbindung.
Verfügt die Klasse des Objektes, das deserialisiert werden soll, über eine
__wakeup-Methode, so wird diese automatisch nach der
eigentlichen Deserialisierung auf dem Objekt aufgerufen.
Wird ein Objekt durch Ablegen in dem Array $_SESSION[]
als Session-Variable registriert, so kümmert sich PHP automatisch um
Serialisierung und Deserialisierung des Objektes zwischen den einzelnen
Requests der Session.
Beispiel 1.35: Verwendung der Methoden __sleep() und __wakeup()
<?php
class Klasse {
function __sleep() {
print "__sleep() aufgerufen.\n";
return get_class_vars(get_class($this));
}
function __wakeup() {
print "__wakeup() aufgerufen.\n";
}
}
$objekt = new Klasse;
$serialisiertesObjekt = serialize($objekt);
$objekt = unserialize($serialisiertesObjekt);
?>__sleep() aufgerufen. __wakeup() aufgerufen.
In Kapitel 12 werden wir mit Propel eine Lösung kennen lernen, die das Speichern von Objekten in einer relationalen Datenbank ermöglicht.