Serialisierung von Objekten in PHP: Von den Grundlagen bis zu fortgeschrittenen Techniken
Serialisierung ist der Prozess der Umwandlung komplexer Datenstrukturen (Objekte, Arrays) in ein lineares Format, das zur Speicherung oder Übertragung geeignet ist. In PHP ist dieser Mechanismus besonders wichtig, um den Zustand von Objekten zwischen Anfragen zu speichern, Daten über APIs zu übertragen oder in Datenbanken zu schreiben. In diesem Artikel werden wir alle Aspekte der Serialisierung in PHP im Detail behandeln.
Was ist Serialisierung und warum wird sie benötigt?
Serialisierung ermöglicht es, ein Objekt in einen String "einzufrieren" und es dann wiederherzustellen. Dies ist in folgenden Szenarien nützlich:
- Speichern von Benutzersitzungen (PHP serialisiert Sitzungsdaten automatisch)
- Zwischenspeichern komplexer Objekte in Redis oder Memcached
- Übertragen von Objekten zwischen Microservices
- Speichern von Konfigurationen in Dateien
- Debugging und Protokollierung von Objektzuständen
Basis-Serialisierung: serialize() und unserialize()
PHP bietet zwei Hauptfunktionen für die Arbeit mit Serialisierung:
<?phpclass User { public $name; public $email; private $password;
public function __construct($name, $email, $password) { $this->name = $name; $this->email = $email; $this->password = $password; }}
$user = new User('Ivan Petrov', 'ivan@example.com', 'secret123');$serialized = serialize($user);echo $serialized;// Ausgabe: O:4:"User":3:{s:4:"name";s:11:"Ivan Petrov";s:5:"email";s:16:"ivan@example.com";s:14:"\\0User\\0password";s:9:"secret123";}
// Wiederherstellung des Objekts$unserialized = unserialize($serialized);echo $unserialized->name; // Ivan Petrov?>Wichtig: Die Funktion serialize() verarbeitet alle Eigenschaften des Objekts, einschließlich privater und geschützter. Private Eigenschaften werden mit dem Präfix \\0ClassName\\0 kodiert, geschützte mit \\0*\\0.
Magische Methoden __sleep() und __wakeup()
Zur Kontrolle des Serialisierungsprozesses stellt PHP zwei magische Methoden bereit:
- __sleep() — wird vor der Serialisierung aufgerufen. Soll ein Array mit den Namen der Eigenschaften zurückgeben, die serialisiert werden sollen.
- __wakeup() — wird nach der Deserialisierung aufgerufen. Wird zur erneuten Initialisierung von Ressourcen (z. B. Datenbankverbindungen) verwendet.
<?phpclass DatabaseConnection { private $connection; private $dsn; private $username; private $password; private $cache = [];
public function __construct($dsn, $username, $password) { $this->dsn = $dsn; $this->username = $username; $this->password = $password; $this->connect(); }
private function connect() { // Simulation einer Datenbankverbindung $this->connection = new stdClass(); $this->connection->connected = true; }
public function __sleep() { // Verbindungsressource und Passwort nicht serialisieren return ['dsn', 'username', 'cache']; }
public function __wakeup() { // Verbindung nach der Deserialisierung wiederherstellen $this->connect(); }}
$db = new DatabaseConnection('mysql:host=localhost;dbname=test', 'root', 'pass');$serialized = serialize($db);$restored = unserialize($serialized);?>Serialisierung in JSON: json_encode() und json_decode()
JSON ist ein universelleres Format, das von vielen Programmiersprachen unterstützt wird. In PHP werden die Funktionen json_encode() und json_decode() zur Serialisierung in JSON verwendet.
<?phpclass Product { public $id; public $name; public $price;
public function __construct($id, $name, $price) { $this->id = $id; $this->name = $name; $this->price = $price; }}
$product Auch in der Bibliothek
Prometheus-Metriken in Rust: Die Bibliotheken prometheus und metrics-exporter-prometheus
OAuth-Client für TypeScript: Integration der Autorisierung in Webanwendungen
E-Mail-Versand mit JavaScript (Node.js): Nodemailer, SendGrid, Mailgun
Arbeiten mit XML in Go (Golang): Die Standardbibliothek encoding/xml
Arbeiten mit YAML in Rust: Die Bibliothek serde_yaml