Signatur
Beschreibung
serialize() erzeugt eine kompakte, textbasierte Darstellung nahezu jeden PHP-Wertes – skalare Typen, Arrays, Objekte und sogar null. Das Ergebnis enthält alle Typinformationen, sodass die ursprüngliche Struktur vollständig wiederhergestellt werden kann. Lediglich Ressource-Handles lassen sich nicht serialisieren.
Typische Einsatzgebiete sind das Speichern komplexer Daten in einer Datenbank oder Datei, das Übertragen von PHP-Strukturen zwischen Prozessen sowie das Caching von Objektgraphen. Wenn Objekte serialisiert werden, werden die Sichtbarkeit und alle Eigenschaften – inklusive private und protected – mitgespeichert.
Klassen können das Verhalten über die Schnittstellen __sleep() / __wakeup() (ältere Methode) oder die Schnittstelle Serializable bzw. __serialize() / __unserialize() (empfohlen seit PHP 7.4) steuern. Damit lassen sich z. B. Datenbankverbindungen oder andere nicht serialisierbare Ressourcen vor dem Speichern sauber schließen.
Das erzeugte Format ist PHP-spezifisch und nicht für den Datenaustausch mit anderen Sprachen geeignet. Für interoperablen Datenaustausch sollte stattdessen json_encode() verwendet werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | mixed | Der zu serialisierende Wert. Kann ein Skalar (int, float, bool, string), null, ein Array oder ein Objekt sein. Ressource-Handles werden nicht unterstützt und führen zu einem serialisierten null-Wert. |
Rückgabewert
Exception geworfen).Beispiele
Skalare und Arrays serialisieren
<?php
$data = [
'name' => 'Alice',
'age' => 30,
'admin' => true,
];
$serialized = serialize($data);
echo $serialized . PHP_EOL;
// Wieder in ein PHP-Array umwandeln
$restored = unserialize($serialized);
var_dump($restored['admin']); // bool(true)
Objekt mit __serialize() / __unserialize() serialisieren
<?php
class UserSession
{
public string $username;
private string $token;
public function __construct(string $username, string $token)
{
$this->username = $username;
$this->token = $token;
}
public function __serialize(): array
{
// Nur username speichern, Token aus Sicherheitsgründen weglassen
return ['username' => $this->username];
}
public function __unserialize(array $data): void
{
$this->username = $data['username'];
$this->token = ''; // Token muss neu gesetzt werden
}
}
$session = new UserSession('Bob', 'secret-token-xyz');
$serialized = serialize($session);
echo $serialized . PHP_EOL;
$restored = unserialize($serialized);
echo $restored->username . PHP_EOL; // Bob
Serialisierten Wert in der Datenbank speichern und laden
<?php
// Beispiel: Konfigurationsdaten als serialisierten String in DB ablegen
$config = [
'theme' => 'dark',
'language' => 'de',
'plugins' => ['cache', 'seo'],
];
// Speichern (PDO-Beispiel)
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE settings (key TEXT, value TEXT)');
$stmt = $pdo->prepare('INSERT INTO settings (key, value) VALUES (?, ?)');
$stmt->execute(['user_config', serialize($config)]);
// Laden
$row = $pdo->query("SELECT value FROM settings WHERE key = 'user_config'")->fetch();
$restored = unserialize($row['value']);
print_r($restored);
// Wichtig · Fallstricke
Sicherheitswarnung: Serialisierte Daten, die aus nicht vertrauenswürdigen Quellen stammen (z. B. Cookies, GET/POST-Parameter), dürfen niemals ohne Validierung mit unserialize() verarbeitet werden. Angreifer können speziell präparierte Strings übergeben, um über sogenannte PHP Object Injection-Angriffe beliebigen Code auszuführen. Wenn externe Daten deserialisiert werden müssen, sollte unbedingt der Parameter allowed_classes von unserialize() verwendet werden, um zugelassene Klassen einzuschränken.
Ressource-Handles (z. B. Datenbankverbindungen, Datei-Handles) können nicht serialisiert werden. Klassen mit solchen Ressourcen müssen __sleep() / __wakeup() oder __serialize() / __unserialize() implementieren, um die Ressourcen korrekt zu behandeln.
Das von serialize() erzeugte Format ist PHP-spezifisch. Für sprachübergreifenden Datenaustausch sollte json_encode() bevorzugt werden. Außerdem kann sich das interne Serialisierungsformat zwischen PHP-Hauptversionen ändern, weshalb langfristig gespeicherte Daten bei einem PHP-Upgrade getestet werden sollten.