Menu
Coddy logo textTech

__serialize & __unserialize

Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 49 von 91.

Wenn Sie ein Objekt zur Speicherung oder Übertragung in einen String umwandeln müssen, verwendet PHP die Serialisierung. Die magischen Methoden __serialize() und __unserialize() geben Ihnen die Kontrolle darüber, welche Daten genau gespeichert und wie sie wiederhergestellt werden.

Die __serialize() Methode gibt ein Array mit zu serialisierenden Daten zurück, während __unserialize() dieses Array empfängt und das Objekt wieder aufbaut:

<?php
class Session {
    public function __construct(
        private string $userId,
        private array $data,
        private int $createdAt
    ) {}
    
    public function __serialize(): array {
        return [
            'userId' => $this->userId,
            'data' => $this->data
        ];
    }
    
    public function __unserialize(array $data): void {
        $this->userId = $data['userId'];
        $this->data = $data['data'];
        $this->createdAt = time();
    }
    
    public function getCreatedAt(): int {
        return $this->createdAt;
    }
}

$session = new Session("user123", ["theme" => "dark"], time());
$serialized = serialize($session);

$restored = unserialize($serialized);
echo "User: " . $restored->getCreatedAt();

Beachten Sie, wie createdAt von der Serialisierung ausgeschlossen wird und beim Deserialisieren einen neuen Zeitstempel erhält. Dies ist nützlich, um sensible Daten, temporäre Werte oder Ressourcen auszuschließen, die nicht serialisiert werden können, wie z. B. Datenbankverbindungen.

Diese Methoden ersetzten die älteren __sleep() und __wakeup() Methoden in PHP 7.4 und bieten einen saubereren Ansatz, bei dem Sie direkt mit Daten-Arrays anstatt mit Eigenschaftsnamen arbeiten.

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein System zum Caching von Benutzerprofilen erstellen, das zeigt, wie __serialize() und __unserialize() Ihnen die Kontrolle darüber geben, welche Daten gespeichert und wie sie wiederhergestellt werden.

Sie werden Ihren Code auf zwei Dateien verteilen:

  • UserProfile.php — Erstellen Sie eine UserProfile-Klasse, die das Profil eines Benutzers mit Caching-Funktionen darstellt. Verwenden Sie Constructor Promotion, um private Eigenschaften für $userId (string), $username (string), $email (string) und $accessToken (string) zu definieren. Fügen Sie eine private $cachedAt-Eigenschaft hinzu, die speichert, wann das Profil zwischengespeichert wurde (setzen Sie diese im Konstruktor initial auf "not cached"). Ihre Klasse benötigt:
    • __serialize() — Gibt ein Array zurück, das nur die userId, username und email enthält. Der accessToken ist sensibel und sollte niemals serialisiert werden. Der cachedAt-Zeitstempel wird bei der Wiederherstellung neu generiert.
    • __unserialize() — Stellt die userId, username und email aus dem Daten-Array wieder her. Setzt accessToken auf "expired" (da Token nicht dauerhaft gespeichert werden sollten).
    • getInfo() — Gibt einen String im Format: "[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]" zurück.
  • main.php — Binden Sie die Datei UserProfile ein. Sie erhalten vier Eingaben: eine Benutzer-ID, einen Benutzernamen, eine E-Mail und einen Zugriffstoken. Erstellen Sie eine UserProfile-Instanz mit diesen Werten. Geben Sie drei Zeilen aus:
    • Die Informationen des ursprünglichen Profils (vor der Serialisierung)
    • Serialisieren Sie das Profil mit serialize() und deserialisieren Sie es anschließend mit unserialize(), um ein wiederhergestelltes Profil zu erstellen. Geben Sie die Informationen des wiederhergestellten Profils aus.
    • Geben Sie "Token preserved: yes" oder "Token preserved: no" aus, je nachdem, ob der Token des wiederhergestellten Profils mit dem ursprünglichen übereinstimmt (Hinweis: Er sollte nicht übereinstimmen, da Token bei der Wiederherstellung ablaufen).

Dieses Muster ist entscheidend für das sichere Caching von Benutzerdaten — Sie möchten die Profilinformationen speichern, aber niemals sensible Anmeldedaten wie Zugriffstoken dauerhaft speichern. Wenn das Profil aus dem Cache wiederhergestellt wird, wird der Token als abgelaufen markiert, was die Anwendung zwingt, einen neuen zu beziehen.

Spickzettel

Die magischen Methoden __serialize() und __unserialize() steuern, welche Daten während der Serialisierung gespeichert werden und wie Objekte wiederhergestellt werden.

__serialize() gibt ein Array mit den zu serialisierenden Daten zurück:

<?php
public function __serialize(): array {
    return [
        'userId' => $this->userId,
        'data' => $this->data
    ];
}

__unserialize() empfängt das Array und baut das Objekt wieder auf:

<?php
public function __unserialize(array $data): void {
    $this->userId = $data['userId'];
    $this->data = $data['data'];
    $this->createdAt = time();
}

Verwenden Sie serialize(), um ein Objekt in einen String umzuwandeln, und unserialize(), um es wiederherzustellen:

<?php
$serialized = serialize($session);
$restored = unserialize($serialized);

Diese Methoden sind nützlich, um sensible Daten, temporäre Werte oder Ressourcen auszuschließen, die nicht serialisiert werden können (wie Datenbankverbindungen). Eigenschaften können während der Deserialisierung mit neuen Werten regeneriert werden.

Probier es selbst

<?php

require_once 'UserProfile.php';

// Eingaben lesen
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));

// TODO: Erstellen Sie eine UserProfile-Instanz mit den Eingabewerten

// TODO: Geben Sie die Informationen des Originalprofils aus (vor der Serialisierung)

// TODO: Serialisieren Sie das Profil und deserialisieren Sie es anschließend, um ein wiederhergestelltes Profil zu erstellen

// TODO: Geben Sie die Informationen des wiederhergestellten Profils aus

// TODO: Geben Sie "Token preserved: yes" oder "Token preserved: no" aus
// abhängig davon, ob das Token des wiederhergestellten Profils mit dem Original übereinstimmt

?>
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung