PHP 8.3.4 Released!

Serialisierung von Objekten

Serialisierung von Objekten - Objekte in Sessions

serialize() erzeugt einen String, welcher die Byte-Stream-Repräsentation eines jeden Wertes besitzt, der in PHP gespeichert werden kann. unserialize() kann diesen String verwenden, um die ursprünglichen Variablenwerte wiederherzustellen. Verwendet man serialize(), um ein Objekt zu speichern, so werden alle Variablen dieses Objektes gespeichert. Die Methoden des Objektes werden nicht gespeichert, nur der Name der Klasse.

Damit man imstande ist, ein Objekt mit unserialize() wiederherzustellen, muss die Klasse des Objektes definiert sein. Das heißt, wenn man ein Objekt der Klasse A serialisiert, erhält man einen String, der sich auf die Klasse A bezieht und die Werte aller darin enthaltenen Variablen beinhaltet. Wenn man in einer anderen Datei diesen String wieder zu einem Objekt der Klasse A deserialisieren will, so muss die Klasse A in dieser Datei vorher bekannt sein. Dies kann man erreichen, indem man die Definition der Klasse A in eine mittels include ladbare Datei auslagert und diese Datei einbindet oder die Funktion spl_autoload_register() verwendet.

<?php
// A.php:

class A {
public
$one = 1;

public function
show_one() {
echo
$this->one;
}
}

// page1.php:

include "A.php";

$a = new A;
$s = serialize($a);
// $s irgendwo ablegen, wo page2.php dies finden kann.
file_put_contents('store', $s);

// page2.php:

// Dies ist nötig, damit unserialize korrekt funktioniert.
include "A.php";

$s = file_get_contents('store');
$a = unserialize($s);

// Nun kann man die Funktion show_one() des Objektes $a
// verwenden.
$a->show_one();
?>

Es ist dringend empfohlen, dass wenn eine Anwendung Objekte zur späteren Verwendung in der Anwendung serialisiert, die Klassendefinitionen in der gesamten Anwendung eingebunden werden. Wird dies nicht beachtet, so wird das Objekt ohne eine Klassendefinition deserialisiert, was dazu führen wird, dass PHP dem Objekt eine Klasse __PHP_Incomplete_Class_Name zuweisen wird, welche keine Methoden besitzt. Dies wird das Objekt nutzlos machen.

Wenn also im obigen Beispiel $a Teil einer Session würde, indem ein neuer Schlüssel zum superglobalen Array $_SESSION hinzugefügt wird, dann sollte die Datei A.php in jeder Seite eingebunden werden, nicht nur in page1.php und page2.php.

Beachten Sie neben den obigen Hinweisen dass man sich in die Serialisierungs- und Deserialisierungs-Ereignisse einklinken kann, indem man die Methoden __sleep() und __wakeup() eines Objektes verwendet. Die Verwendung von __sleep() erlaubt es nur eine Teilmenge der Eigenschaften eines Objektes zu serialisieren.

add a note

User Contributed Notes 4 notes

up
229
php at lanar dot com dot au
14 years ago
Note that static members of an object are not serialized.
up
29
michael at smith-li dot com
9 years ago
Reading this page you'd be left with the impression that a class's `serialize` and `unserialize` methods are unrelated to the `serialize` and `unserialize` core functions; that only `__sleep` and `__unsleep` allow you to customize an object's serialization interface. But look at http://php.net/manual/en/class.serializable.php and you'll see that there is a more straightforward way to control how a user-defined object is serialized and unserialized.
up
3
Anonymous
3 years ago
Until such time as these documents are updated, note that `session_register()` is not needed to automatically serialize & unserialize objects in sessions. Any objects in `$_SESSION` are serialized when the session is closed (via `session_write_close()` or upon script exit) & unserialized when opened (via `session_start()`). The note about including classes throughout an app (either by including the definition globally or autoloading it) still holds.
up
-11
Yahia Fouda
1 year ago
This trick can be useful when you need to pass object data as strings of text between scripts and applications. Common situations include:

* Passing objects via fields in web forms
* Passing objects in URL query strings
* Storing object data in a text file, or in a single database field

and Sometimes it’s useful to do some cleaning up before serializing an object. For example, you might want to write unsaved object data to a database and close the database connection. Similarly, after you’ve unserialized an object, you might want to restore its database connection and perform other setup tasks so that the new object can be used properly.
To Top