__serialize e __unserialize
Fa parte della sezione Programmazione orientata agli oggetti del percorso PHP di Coddy. Lezione 49 di 91.
Quando devi convertire un oggetto in una stringa per archiviarlo o trasmetterlo, PHP usa la serializzazione. I metodi magici __serialize() e __unserialize() ti consentono di controllare esattamente quali dati vengono salvati e come vengono ripristinati.
Il metodo __serialize() restituisce un array di dati da serializzare, mentre __unserialize() riceve quell'array e ricostruisce l'oggetto:
<?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();
Nota che createdAt viene escluso dalla serializzazione e riceve un timestamp aggiornato quando viene deserializzato. Questo è utile per escludere dati sensibili, valori temporanei o risorse che non possono essere serializzate, come le connessioni al database.
Questi metodi hanno sostituito i vecchi metodi __sleep() e __wakeup() in PHP 7.4, offrendo un approccio più pulito in cui lavori direttamente con gli array di dati anziché con i nomi delle proprietà.
Sfida
FacileCreiamo un sistema di memorizzazione nella cache dei profili utente che mostra come __serialize() e __unserialize() ti consentono di controllare quali dati vengono salvati e come vengono ripristinati.
Organizzerai il codice in due file:
UserProfile.php: crea una classeUserProfileche rappresenta il profilo di un utente con funzionalità di memorizzazione nella cache. Usa la promozione del costruttore per definire proprietà private per$userId(stringa),$username(stringa),$email(stringa) e$accessToken(stringa). Aggiungi una proprietà privata$cachedAtche memorizza quando è stato memorizzato nella cache il profilo (impostala inizialmente su"not cached"nel costruttore). La tua classe deve includere:__serialize(): restituisce un array contenente solouserId,usernameedemail.accessTokenè un dato sensibile e non deve mai essere serializzato. Il timestampcachedAtverrà rigenerato al ripristino.__unserialize(): ripristinauserId,usernameedemaildall'array dei dati. ImpostaaccessTokensu"expired"(poiché i token non devono essere mantenuti).getInfo(): restituisce una stringa nel formato:"[username] ([email]) - Token: [accessToken]"
main.php: includi il file UserProfile. Riceverai quattro input: un ID utente, un nome utente, un indirizzo email e un token di accesso. Crea un'istanza diUserProfilecon questi valori. Stampa tre righe:- Le informazioni del profilo originale (prima della serializzazione)
- Serializza il profilo usando
serialize(), poi deserializzalo usandounserialize()per creare un profilo ripristinato. Stampa le informazioni del profilo ripristinato. - Stampa
"Token preserved: yes"oppure"Token preserved: no"a seconda che il token del profilo ripristinato corrisponda a quello originale (suggerimento: non dovrebbe corrispondere, poiché i token scadono al ripristino)
Questo schema è essenziale per memorizzare nella cache i dati utente in modo sicuro. Vuoi salvare le informazioni del profilo, ma non mantenere mai credenziali sensibili come i token di accesso. Quando il profilo viene ripristinato dalla cache, il token viene contrassegnato come scaduto, costringendo l'applicazione a ottenerne uno nuovo.
Provalo tu
<?php
require_once 'UserProfile.php';
// Leggi i valori di input
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));
// TODO: Crea un'istanza di UserProfile con i valori di input
// TODO: Stampa le informazioni del profilo originale (prima della serializzazione)
// TODO: Serializza il profilo, poi deserializzalo per creare un profilo ripristinato
// TODO: Stampa le informazioni del profilo ripristinato
// TODO: Stampa "Token preserved: yes" oppure "Token preserved: no"
// a seconda che il token del profilo ripristinato corrisponda a quello originale
?>Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave $thisMetodiProprietàCostruttore (__construct)Distruttore (__destruct)Riepilogo - Calcolatrice semplice4Ereditarietà
Ereditarietà di baseLa parola chiave parent::Sovrascrittura dei metodiLa parola chiave finalClassi astratteRiepilogo - Gerarchia dei dipendenti7Incapsulamento
Pubblico, Protetto, PrivatoApprofondimento sui modificatori di accessoGetter e SetterOccultamento delle informazioniPromozione dei parametri del costruttore (8.0)Riepilogo - Sistema di gestione dei registri degli studenti10Concetti avanzati di programmazione a oggetti
Composizione vs ereditarietàDependency InjectionClassi anonimeEnumerazioni (PHP 8.1)Fibers (PHP 8.1)Approfondimento sulla clonazione degli oggettiGeneratori e iteratori13Modelli di progettazione, parte 2
Modello CommandModello AdapterModello DecoratorModello Template MethodModello StateModello CompositeModello Repository2Namespace e autoloading
Introduzione ai namespaceLa keyword useStandard di autoloading PSR-4Autoloader di ComposerRiepilogo - Progetto organizzato5Interfacce e contratti
Introduzione alle interfacceImplementare le interfacceImplementare più interfacceInterfaccia vs classe astrattaType hinting con le interfacceRiepilogo - Calcolatore di forme8Metodi magici
Introduzione ai metodi magici__toString e __debugInfo__get, __set, __isset, __unset__call e __callStatic__clone e clonazione degli oggetti__serialize e __unserializeRiepilogo - Collezione personalizzata11Sistema dei tipi e gestione degli errori
Dichiarazioni di tipoTipi nullableTipi unione e intersezioneClassi di eccezioneGerarchia di eccezioni personalizzataTry, Catch, FinallyRiepilogo - Validatore di moduli14Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente3Proprietà delle classi
Proprietà di istanza e staticheCostanti nelle classiMetodi e proprietà staticiProprietà private e protectedProprietà readonly (PHP 8.1)Riepilogo - Gestore di conti bancari6Polimorfismo
Ridefinizione dei metodi, ripresaPolimorfismo tramite interfacceSuggerimenti sui tipi e tipi UnionBinding statico tardivoRiepilogo - Processore di pagamenti9Tratti
Introduzione ai trattiUtilizzare più trattiRisoluzione dei conflitti tra trattiMetodi astratti nei trattiTratti vs ereditarietà12Design pattern - Parte 1
Introduzione ai design patternPattern SingletonPattern FactoryPattern ObserverPattern StrategyEsercitati da solo: Compilatore PHP online