Objekt-Serialisierung in PHP: Vollständige Anleitung
\n\nSerialisierung ist der Prozess der Umwandlung komplexer Datenstrukturen (Objekte, Arrays) in eine Zeichenkette oder ein binäres Format, das in einer Datei gespeichert, über ein Netzwerk übertragen oder zwischengespeichert werden kann. In PHP wird dieser Mechanismus durch die integrierten Funktionen serialize() und unserialize() realisiert. In diesem Artikel werden wir im Detail besprechen, wie die Objekt-Serialisierung funktioniert, welche Fallstricke es gibt und wie man magische Methoden zur Feinabstimmung des Prozesses einsetzt.
Grundlegende Serialisierungsfunktionen
\n\nPHP bietet zwei Schlüsselfunktionen für die Arbeit mit der Serialisierung:
\n\n- \n
serialize($value)— wandelt einen Wert (außer resource) in eine Zeichenkette um, die zur Speicherung geeignet ist. Bei Objekten werden der Klassenname und alle Eigenschaften (einschließlich privater und geschützter) gespeichert. \n unserialize($string)— stellt den ursprünglichen Wert aus einer Zeichenkette wieder her. Bei Objekten wird automatisch der Konstruktor der Klasse aufgerufen (falls definiert) und die gespeicherten Eigenschaften werden eingesetzt. \n
Einfaches Beispiel einer Objekt-Serialisierung
\n\nBetrachten wir eine Basisklasse User und ihre Serialisierung:
<?php\nclass User {\n public $name;\n public $email;\n private $password;\n\n public function __construct($name, $email, $password) {\n $this->name = $name;\n $this->email = $email;\n $this->password = $password;\n }\n}\n\n$user = new User('Ivan', 'ivan@example.com', 'secret123');\n$serialized = serialize($user);\necho $serialized;\n// Ausgabe: O:4:"User":3:{s:4:"name";s:8:"Ivan";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}\n?>\n\nBeachten Sie: Die private Eigenschaft $password erscheint in der Zeichenkette als \\0User\\0password – dies ist eine spezielle Kennzeichnung für private Felder, wobei \\0 das Nullbyte darstellt.
Wiederherstellung eines Objekts aus einer serialisierten Zeichenkette
\n\n<?php\n$serialized = 'O:4:"User":3:{s:4:"name";s:8:"Ivan";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}';\n$user = unserialize($serialized);\necho $user->name; // Ivan\necho $user->email; // ivan@example.com\n// Die private Eigenschaft password wurde ebenfalls wiederhergestellt, ist aber nicht direkt zugänglich\n?>\n\nWichtig: Bei der Deserialisierung versucht PHP, die Klasse zu laden, falls sie noch nicht definiert ist. Wenn die Klasse nicht existiert, wird eine Instanz der integrierten Klasse __PHP_Incomplete_Class erstellt.
Magische Methoden __sleep() und __wakeup()
\n\nZur Kontrolle des Serialisierungsprozesses bietet PHP zwei magische Methoden:
\n\n- \n
__sleep()— wird vor der Serialisierung aufgerufen. Soll ein Array mit den Namen der Eigenschaften zurückgeben, die serialisiert werden sollen. Nützlich zum Schließen von Datenbankverbindungen, Freigeben von Ressourcen oder Verbergen vertraulicher Daten. \n __wakeup()— wird unmittelbar nach der Deserialisierung aufgerufen. Wird verwendet, um erneut eine Verbindung zur Datenbank herzustellen, Ressourcen wiederherzustellen oder die Datenintegrität zu überprüfen. \n
Beispiel mit __sleep() und __wakeup()
\n\n<?php\nclass DatabaseConnection {\n private $host;\n private $user;\n private $password;\n private $connection;\n\n public function __construct($host, $user, $password) {\n $this->host = $host;\n $this->user = $user;\n $this->password = $password;\n $this->connect();\n }\n\n private function connect() {\n // Simulation der Verbindung\n $this->connection = "Verbindungsressource zu {$this->host}";\n }\n\n public function __sleep() {\n // Die Verbindungsressource nicht serialisieren, nur die Daten für die erneute Verbindung\n return ['host', 'user', 'password'];\n }\n\n public function __wakeup() {\n // Stellt die Auch in der Bibliothek
Datenvalidierung in C++: Bibliotheken und Methoden (libvalidate, nlohmann/json, Boost)
Sinon für JavaScript (Node.js): Komplettguide mit Beispielen
Arbeiten mit Markdown in C++: Bibliotheken, Parser und Werkzeuge
Bildverarbeitung in Kotlin: resize und crop mit der Bibliothek Kamel
Swagger-PHP für PHP: Komplette Anleitung mit Beispielen