Menu
CoddyTech

__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à.

challenge icon

Sfida

Facile

Creiamo 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 classe UserProfile che 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 $cachedAt che 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 solo userId, username ed email. accessToken è un dato sensibile e non deve mai essere serializzato. Il timestamp cachedAt verrà rigenerato al ripristino.
    • __unserialize(): ripristina userId, username ed email dall'array dei dati. Imposta accessToken su "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 di UserProfile con questi valori. Stampa tre righe:
    • Le informazioni del profilo originale (prima della serializzazione)
    • Serializza il profilo usando serialize(), poi deserializzalo usando unserialize() 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

?>
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore PHP online