Objekt-Serialisierung in PHP: Funktionen, Methoden und praktische Beispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Objekt-Serialisierung in PHP: Vollständige Anleitung

\n\n

Serialisierung 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.

\n\n

Grundlegende Serialisierungsfunktionen

\n\n

PHP 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
\n\n

Einfaches Beispiel einer Objekt-Serialisierung

\n\n

Betrachten wir eine Basisklasse User und ihre Serialisierung:

\n\n
<?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\n

Beachten 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.

\n\n

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\n

Wichtig: 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.

\n\n

Magische Methoden __sleep() und __wakeup()

\n\n

Zur 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
\n\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                    

Empfehlungen