sleep()

Aus php bar

Wechseln zu: Navigation, Suche

Objekte bestehen nur zur Laufzeit eines Skriptes. Dennoch gibt es die Möglichkeit Objekte dauerhaft zu speichern um zu einem späteren Zeitpunkt wieder verwendet zu werden. Die Speicherung eines Objektes und dessen Zustand wird auch Serialisierung genannt.

Mit serialize() stellt PHP eine Funktion zur Verfügung, mit welcher es möglich ist beispielsweise ein Objekt zu „serialisieren“. Das bedeutet, dass aus dem Objekt ein String erzeugt wird (Rückgabewert), welcher eine kodierte Form besitzt.

1 //irgendein Skript:
2 
3 class Test {
4 	public $var = 'Variable';
5 }
6 echo serialize(new Test());
7 
8 /* Speichern des kodierten Strings, um in einem
9    anderen Skript das Objekt verwenden zu können. */
Ausgabe: O:4:"Test":1:{s:3:"var";s:8:"Variable";}

Der String kann dann etwa in einer Datenbank oder in einer Textdatei abgespeichert werden, um zu einem späteren Zeitpunkt wieder zugänglich gemacht zu werden.

Der Zugriff erfolgt über die Funktion unserialize(), welche den kodierten String wieder in ein Objekt mitsamt all seinen Eigenschaften umwandelt. Der Parameterwert muss also der kodierte String sein um das Objekt als Rückgabewert zu bekommen und damit weiterzuarbeiten. Man nennt das auch Rekonstruktion von Ressourcen eines Objektes.

1 //irgendein anderes Skript:
2 
3 /* Abrufen des kodierten Strings aus dem Speicher, Zuweisung
4    einer Variable um das Objekt wiederherzustellen. */
5 
6 $wert = 'O:4:"Test":1:{s:3:"var";s:8:"Variable";}';
7 $Object = unserialize($wert);
8 
9 echo $Object->var;
Ausgabe: Variable

Bevor ein Objekt serialisiert werden soll prüft PHP, ob die Klasse des zu serialisierenden Objektes eine Methode namens __sleep() besitzt. Ist dem so, wird deren Code vor der eigentlichen Serialisierung ausgeführt. Analog zum Serialisieren wird beim Deserialsieren die Methode __wakeup() ausgeführt.


Die magische Methode __sleep() ist in der Lage das Objekt aufzuräumen. Der Rückgabewert muss ein Array mit den Namen aller Instanzvariablen des zu serialisierenden Objektes sein, die in der kodierten Form des Strings gespeichert werden sollen. Die beabsichtigte Verwendung von __sleep() ist, eventuelle Datenbankverbindungen des Objektes zu schließen, noch offene Daten zu committen, oder ähnliche Säuberungsaktionen durchzuführen. Weiters ist diese Funktion hilfreich, wenn Sie sehr große Objekte haben, die nicht komplett gespeichert werden müssen.

Das folgende Beispiel bezieht sich auf letzteren Anwendungsfall.

 class SerializeTest {
 	public $var  = 'Variable';
 	public $var1 = 'Variable 1';
 	private $resource = 'Resource id #1';	//eine Ressource
 
 	function __sleep() {	
 		//speichert $var und $var1, nicht aber die Ressource!
 		return array('var', 'var1'); 
 	}
10 }
11 
12 $Serialize = new SerializeTest();
13 echo serialize($Serialize);		//Aufruf von __sleep()
14 

In __sleep() wurde nun spezifiziert, dass nur $var und $var1 für einen späteren Zugriff benötigt werden. Folglich ist der Rückgabewert von serialize() und zugleich auch die Ausgabe des Skriptes diese:

Ausgabe: O:13:"SerializeTest":2:{s:3:"var";s:8:"Variable";s:4:"var1";s:10:"Variable 1";}

Da im zurückgegebenen Array nicht zusätzlich der Wert „resource“ angegeben wurde, wird der Variablenwert von $resource nicht in die kodierte Form des Strings aufgenommen. Wenn ein sehr großes Objekt serialisiert werden soll und alle seine Eigenschaften ebenfalls beibehalten werden sollen wäre es viel Arbeit alle Instanzvariablen einzeln dem Rückgabe-Array zuzuordnen. Ein „Work-Around“ könnte dann etwa wie folgt aussehen:

1 function __sleep() {
2 	return get_object_vars($this);
3 }


Siehe auch: __wakeup()


Persönliche Werkzeuge