__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.
Aufgabe
EinfachLassen 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 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 einen Zugriffstoken. Erstellen Sie eineUserProfile-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 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 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
?>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