Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

PHP serialize und unserialize: Daten speicherbar machen

Sie befinden sich: Home > Php Tutorial > PHP serialize und unseriali...

PHP serialize und unserialize: Daten speicherbar machen


Eintrag am:  06.05.2026
Hits / Besucher:  14
Sprache:  Deutsch
Kategorie:  Fortgeschrittene Tut...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

PHP-Variablen existieren nur während der Laufzeit eines Skripts. Sobald die Ausführung endet, gehen alle Werte verloren. Die Funktionen serialize() und unserialize() lösen dieses Problem, indem sie beliebige PHP-Werte in einen speicherbaren String umwandeln und später daraus wiederherstellen. So lassen sich Arrays, Objekte und andere Datentypen in Datenbanken, Dateien oder Sessions ablegen, ohne ihre Struktur zu verlieren.

Illustration zum Tutorial: PHP serialize und unserialize: Daten speicherbar machen

Zunächst lohnt sich ein Blick auf die Arbeitsweise von serialize() und das Format, in dem PHP die Daten ablegt.

Was macht serialize()?

Die Funktion serialize() nimmt einen PHP-Wert entgegen und gibt einen String zurück, der den Wert vollständig beschreibt. Dieser String enthält Informationen über den Datentyp, die Länge und den Inhalt. Das Format ist PHP-spezifisch und folgt einer kompakten Notation: s:5:"hello" steht für einen String mit fünf Zeichen, i:42 für einen Integer und b:1 für true. Arrays werden mit a: gekennzeichnet, Objekte mit O:.

flowchart TD
    A["PHP-Wert"] --> B["serialize()"]
    B --> C["String-Repräsentation"]
    C --> D["Datenbank<br/>oder Datei"]
    D --> E["unserialize()"]
    E --> F["PHP-Wert"]

Der erzeugte String lässt sich anschließend beliebig speichern, übertragen oder zwischenspeichern.

Daten mit unserialize() wiederherstellen

Die Gegenfunktion unserialize() liest den serialisierten String und erzeugt daraus den ursprünglichen PHP-Wert. Dabei werden Datentypen, Strukturen und Verschachtelungen exakt wiederhergestellt. Wichtig ist, dass der String unverändert vorliegt. Bereits kleine Änderungen am serialisierten String führen zu einem Fehler bei der Deserialisierung.

Arrays serialisieren

Arrays sind der häufigste Anwendungsfall für serialize(). Sowohl numerische als auch assoziative Arrays werden vollständig abgebildet.

<?php

$daten = ['name' => 'Max', 'alter' => 28, 'aktiv' => true];

$serialisiert = serialize($daten);
echo $serialisiert;
/* a:3:{s:4:"name";s:3:"Max";s:5:"alter";i:28;s:5:"aktiv";b:1;} */

$wiederhergestellt = unserialize($serialisiert);
echo $wiederhergestellt['name']; /* Max */

Auch verschachtelte Arrays bleiben erhalten. Jeder Schlüssel und jeder Wert wird mit seinem Typ und seiner Länge codiert. Das macht das Format zuverlässig, aber auch länger als vergleichbare Formate wie JSON.

Objekte serialisieren

Objekte lassen sich ebenso serialisieren. PHP speichert dabei den Klassennamen und alle Eigenschaften des Objekts. Beim Deserialisieren muss die Klassendefinition verfügbar sein, da PHP sonst ein unvollständiges Objekt erzeugt.

<?php

class Benutzer
{
public function __construct(
public string $name,
public string $email
) {}
}

$user = new Benutzer('Max', 'max@example.com');
$gespeichert = serialize($user);

$geladen = unserialize($gespeichert);
echo $geladen->name; /* Max */

Für die Steuerung des Serialisierungsvorgangs bietet PHP zwei Mechanismen.

__sleep und __wakeup

Die Magic Methods __sleep() und __wakeup() erlauben eine gezielte Kontrolle über den Vorgang. __sleep() wird vor dem Serialisieren aufgerufen und gibt ein Array mit den Namen der Eigenschaften zurück, die gespeichert werden sollen. Datenbankverbindungen oder temporäre Caches lassen sich so ausschließen. __wakeup() wird nach dem Deserialisieren aufgerufen und eignet sich, um Verbindungen neu aufzubauen oder Initialisierungen durchzuführen.

Das Serializable Interface

Alternativ kann eine Klasse das Serializable Interface implementieren. Es definiert die Methoden serialize() und unserialize(), die vollständige Kontrolle über das gespeicherte Format geben. In neueren PHP-Versionen (ab 8.1) gilt dieses Interface als veraltet. Stattdessen empfiehlt PHP die Verwendung der Magic Methods __serialize() und __unserialize(), die als Nachfolger konzipiert sind und flexibler arbeiten.

serialize vs. json_encode

Beide Funktionen wandeln Daten in Strings um, unterscheiden sich aber in wichtigen Punkten.

<?php

$daten = ['fruechte' => ['Apfel', 'Birne'], 'anzahl' => 2];

$serialized = serialize($daten);
$json = json_encode($daten);

echo strlen($serialized); /* laenger, PHP-spezifisch */
echo strlen($json); /* kuerzer, sprachuebergreifend */

serialize() ist PHP-spezifisch und bewahrt Datentypen, Objektklassen und Referenzen. json_encode() erzeugt ein sprachübergreifendes Format, das sich für APIs und den Austausch mit JavaScript eignet. JSON kann jedoch keine PHP-Objekte mit Klassenzugehörigkeit abbilden. Für rein interne Speicherung (Sessions, Caches) ist serialize() die passende Wahl. Für den Datenaustausch mit externen Systemen bietet sich JSON an.

Sicherheitshinweise zu unserialize

Das Deserialisieren von Daten aus nicht vertrauenswürdigen Quellen birgt erhebliche Risiken. Ein Angreifer kann manipulierte Strings einschleusen, die beim Deserialisieren beliebige Objekte erzeugen. Dieses Angriffsmuster heißt Object Injection und kann zur Ausführung von Schadcode führen.

<?php

$daten = unserialize($eingabe, ['allowed_classes' => false]);

/* Nur bestimmte Klassen erlauben */
$daten = unserialize($eingabe, [
'allowed_classes' => ['Benutzer', 'Produkt']
]);

Der Parameter allowed_classes schränkt ein, welche Klassen instanziiert werden dürfen. Mit false werden alle Objekte zu __PHP_Incomplete_Class konvertiert. Grundsätzlich gilt: Deserialisiere niemals Benutzereingaben ohne diese Einschränkung. Closures und Ressourcen (wie Datenbankverbindungen) können generell nicht serialisiert werden und lösen eine Exception aus.

Fazit

serialize() und unserialize() sind zuverlässige Werkzeuge, um PHP-Daten persistent zu speichern. Sie bewahren Typen und Objektstrukturen vollständig. Für den sprachübergreifenden Datenaustausch ist JSON die bessere Wahl, für interne Speicherung bleibt die PHP-Serialisierung ein bewährtes Mittel. Verwende bei unserialize() stets den allowed_classes Parameter, um Object Injection Angriffe zu verhindern.

 


Kommentare (0)

Noch keine Kommentare. Sei der Erste!

Melde dich an, um einen Kommentar zu schreiben.
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.