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 konvertieren 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 "Created at: " . $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 Benutzerprofil-Caching-System 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 aufteilen:

  • 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 ein Zugriffs-Token. Erstellen Sie eine UserProfile-Instanz mit diesen Werten. Geben Sie drei Zeilen aus:
    • Die Informationen des Originalprofils (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 das Token des wiederhergestellten Profils mit dem Original übereinstimmt (Hinweis: Es sollte nicht übereinstimmen, da Token bei der Wiederherstellung ablaufen).

Dieses Muster ist essenziell für das sichere Caching von Benutzerdaten — Sie möchten die Profilinformationen speichern, aber niemals sensible Anmeldedaten wie Zugriffs-Token dauerhaft sichern. Wenn das Profil aus dem Cache wiederhergestellt wird, wird das Token als abgelaufen markiert, was die Anwendung zwingt, ein neues zu beziehen.

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: Erstelle eine UserProfile-Instanz mit den Eingabewerten

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

// TODO: Serialisiere das Profil und deserialisiere es anschließend, um ein wiederhergestelltes Profil zu erstellen

// TODO: Gib die Informationen des wiederhergestellten Profils aus

// TODO: Gib "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