__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.
Aufgabe
EinfachLassen 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 eineUserProfile-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 dieuserId,usernameundemailenthält. DeraccessTokenist sensibel und sollte niemals serialisiert werden. DercachedAt-Zeitstempel wird bei der Wiederherstellung neu generiert.__unserialize()— Stellt dieuserId,usernameundemailaus dem Daten-Array wieder her. SetztaccessTokenauf"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 eineUserProfile-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 mitunserialize(), 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
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung