Signatur
Beschreibung
Das Interface Serializable bietet eine Möglichkeit, das Verhalten der PHP-Funktionen serialize() und unserialize() für Objekte einer Klasse individuell zu definieren. Klassen, die dieses Interface implementieren, müssen die beiden Methoden serialize(): string und unserialize(string $data): void bereitstellen.
Beim Aufruf von serialize() auf ein Objekt wird anstelle des Standard-Serialisierungsmechanismus die Methode Serializable::serialize() aufgerufen. Sie soll einen String zurückgeben, der den Zustand des Objekts vollständig abbildet. Beim Deserialisieren mit unserialize() wird entsprechend Serializable::unserialize() aufgerufen, um den Objektzustand aus dem übergebenen String wiederherzustellen.
Wichtig: Ab PHP 8.1.0 gilt das Serializable-Interface als deprecated. Stattdessen sollen die magischen Methoden __serialize() und __unserialize() verwendet werden, die flexibler, sicherer und konsistenter mit dem PHP-Objektmodell arbeiten. Bestehende Implementierungen von Serializable sollten schrittweise auf __serialize()/__unserialize() migriert werden.
Das Interface eignet sich besonders dann, wenn sensible oder transiente Eigenschaften (z. B. Datenbankverbindungen, offene Ressourcen) beim Serialisieren explizit ausgeschlossen werden müssen und beim Deserialisieren gezielt neu initialisiert werden sollen.
Beispiele
Benutzerdefinierte Serialisierung mit Serializable
<?php
class UserSession implements Serializable
{
private string $username;
private string $token;
// Datenbankverbindung wird NICHT serialisiert
private mixed $dbConnection = null;
public function __construct(string $username, string $token)
{
$this->username = $username;
$this->token = $token;
}
public function serialize(): string
{
// Nur relevante Daten serialisieren
return serialize([
'username' => $this->username,
'token' => $this->token,
]);
}
public function unserialize(string $data): void
{
$values = unserialize($data);
$this->username = $values['username'];
$this->token = $values['token'];
// Datenbankverbindung wird neu aufgebaut
$this->dbConnection = null;
}
public function getUsername(): string
{
return $this->username;
}
}
$session = new UserSession('alice', 'abc123');
$serialized = serialize($session);
echo $serialized . "\n";
$restored = unserialize($serialized);
echo $restored->getUsername(); // alice
Moderne Alternative: __serialize() und __unserialize() (empfohlen ab PHP 8.1)
<?php
// Empfohlener Ersatz für das deprecated Serializable-Interface
class UserSession
{
private string $username;
private string $token;
private mixed $dbConnection = null;
public function __construct(string $username, string $token)
{
$this->username = $username;
$this->token = $token;
}
public function __serialize(): array
{
return [
'username' => $this->username,
'token' => $this->token,
];
}
public function __unserialize(array $data): void
{
$this->username = $data['username'];
$this->token = $data['token'];
$this->dbConnection = null;
}
public function getUsername(): string
{
return $this->username;
}
}
$session = new UserSession('bob', 'xyz789');
$serialized = serialize($session);
$restored = unserialize($serialized);
echo $restored->getUsername();
// Wichtig · Fallstricke
Deprecation ab PHP 8.1.0: Das Serializable-Interface ist seit PHP 8.1.0 als veraltet markiert und wird in einer zukünftigen PHP-Version entfernt. Neue Implementierungen sollten ausschließlich die magischen Methoden __serialize() und __unserialize() nutzen.
Sicherheitshinweis: Das Deserialisieren von Daten aus nicht vertrauenswürdigen Quellen ist grundsätzlich gefährlich und kann zu Object Injection-Angriffen führen. Die unserialize()-Funktion sollte niemals auf Benutzereingaben oder externe Daten ohne strikte Validierung angewendet werden. Für die Übergabe von Daten aus Fremdsystemen sind JSON oder andere sichere Formate vorzuziehen.
Klassen, die sowohl Serializable als auch __serialize()/__unserialize() implementieren, verwenden ab PHP 8.0 bevorzugt die magischen Methoden; das Interface wird dann ignoriert.