Start · Sprachen · PHP · Referenz · serialize

serialize

Funktion

Wandelt einen beliebigen PHP-Wert in eine speicherbare Zeichenkette um, die später mit <code>unserialize()</code> wieder in den ursprünglichen Wert zurückverwandelt werden kann.

seit PHP 4.0.0 Kategorie: type

Signatur

serialize(mixed $value): string

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

Typ
string
Beschreibung
Eine Zeichenkette, die die serialisierte Darstellung des übergebenen Wertes enthält. Die Funktion gibt immer einen String zurück und schlägt nie fehl (außer bei internen Objekten, die das Serialisieren explizit verbieten – dann wird eine 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)
a:3:{s:4:"name";s:5:"Alice";s:3:"age";i:30;s:5:"admin";b:1;} 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
O:11:"UserSession":1:{s:8:"username";s:3:"Bob";} 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);
Array ( [theme] => dark [language] => de [plugins] => Array ( [0] => cache [1] => seo ) )

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