__serialize & __unserialize
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 49 von 91.
Wenn du ein Objekt zur Speicherung oder Übertragung in eine Zeichenkette umwandeln musst, verwendet PHP die Serialisierung. Die magischen Methoden __serialize() und __unserialize() geben dir Kontrolle darüber, welche Daten genau gespeichert werden und wie sie wiederhergestellt werden.
Die Methode __serialize() gibt ein Array mit zu serialisierenden Daten zurück, während __unserialize() dieses Array empfängt und das Objekt wiederherstellt:
<?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();
Beachte, dass createdAt von der Serialisierung ausgeschlossen wird und bei der Deserialisierung einen neuen Zeitstempel erhält. Dies ist nützlich, um vertrauliche Daten, temporäre Werte oder Ressourcen auszuschließen, die nicht serialisiert werden können, etwa Datenbankverbindungen.
Diese Methoden ersetzten in PHP 7.4 die älteren Methoden __sleep() und __wakeup() und bieten einen übersichtlicheren Ansatz, bei dem du direkt mit Daten-Arrays statt mit Eigenschaftsnamen arbeitest.
Aufgabe
EinfachLass uns ein Benutzerprofil-Caching-System erstellen, das veranschaulicht, wie __serialize() und __unserialize() dir Kontrolle darüber geben, welche Daten gespeichert und wie sie wiederhergestellt werden.
Du organisierst deinen Code über zwei Dateien:
UserProfile.php: Erstelle eineUserProfile-Klasse, die das Profil eines Benutzers mit Caching-Funktionen darstellt. Verwende Constructor Promotion, um private Eigenschaften für$userId(String),$username(String),$email(String) und$accessToken(String) zu definieren. Füge eine private Eigenschaft$cachedAthinzu, die speichert, wann das Profil zwischengespeichert wurde (setze sie im Konstruktor zunächst auf"not cached"). Deine Klasse benötigt:__serialize(): Gibt ein Array zurück, das nuruserId,usernameundemailenthält. DeraccessTokenist vertraulich und darf niemals serialisiert werden. Der ZeitstempelcachedAtwird bei der Wiederherstellung neu erzeugt.__unserialize(): StelltuserId,usernameundemailaus dem Daten-Array wieder her. SetztaccessTokenauf"expired"(da Token nicht dauerhaft gespeichert werden sollten).getInfo(): Gibt einen String im folgenden Format zurück:"[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
main.php: Binde die UserProfile-Datei ein. Du erhältst vier Eingaben: eine Benutzer-ID, einen Benutzernamen, eine E-Mail-Adresse und ein Zugriffstoken. Erstelle mit diesen Werten eineUserProfile-Instanz. Gib drei Zeilen aus:- Die Informationen des ursprünglichen Profils (vor der Serialisierung)
- Serialisiere das Profil mit
serialize()und deserialisiere es anschließend mitunserialize(), um ein wiederhergestelltes Profil zu erstellen. Gib die Informationen des wiederhergestellten Profils aus. - Gib
"Token preserved: yes"oder"Token preserved: no"aus, je nachdem, ob das Token des wiederhergestellten Profils mit dem ursprünglichen übereinstimmt (Hinweis: Es sollte nicht übereinstimmen, da Token bei der Wiederherstellung ablaufen.)
Dieses Muster ist entscheidend, um Benutzerdaten sicher zwischenzuspeichern. Du möchtest die Profilinformationen speichern, aber vertrauliche Zugangsdaten wie Zugriffstoken niemals dauerhaft speichern. Wenn das Profil aus dem Cache wiederhergestellt wird, wird das Token als abgelaufen markiert, sodass die Anwendung ein neues Token anfordern muss.
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 Infos des ursprünglichen Profils aus (vor der Serialisierung)
// TODO: Serialisiere das Profil und deserialisiere es anschließend, um ein wiederhergestelltes Profil zu erstellen
// TODO: Gib die Infos des wiederhergestellten Profils aus
// TODO: Print "Token preserved: yes" or "Token preserved: no"
// je nachdem, 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 OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler