Menu
Coddy logo textTech

__serialize y __unserialize

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 49 de 91.

Cuando necesitas convertir un objeto en una cadena para almacenarlo o transmitirlo, PHP utiliza la serialización. Los métodos mágicos __serialize() y __unserialize() te permiten controlar exactamente qué data se guarda y cómo se restaura.

El método __serialize() devuelve un array de datos que se serializarán, mientras que __unserialize() recibe ese array y reconstruye el objeto:

<?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();

Observa cómo createdAt se excluye de la serialización y obtiene una marca de tiempo nueva cuando se deserializa. Esto resulta útil para excluir datos confidenciales, valores temporales o recursos que no se pueden serializar, como las conexiones a bases de datos.

Estos métodos reemplazaron a los métodos anteriores __sleep() y __wakeup() en PHP 7.4, ofreciendo un enfoque más limpio en el que trabajas directamente con matrices de datos en lugar de nombres de propiedades.

challenge icon

Desafío

Fácil

Construyamos un sistema de almacenamiento en caché de perfiles de usuario que demuestre cómo __serialize() y __unserialize() te dan control sobre qué datos se guardan y cómo se restauran.

Organizarás tu código en dos archivos:

  • UserProfile.php: Crea una clase UserProfile que represente el perfil de un usuario con capacidades de almacenamiento en caché. Usa la promoción del constructor para definir propiedades privadas para $userId (string), $username (string), $email (string) y $accessToken (string). Añade una propiedad privada $cachedAt que almacene cuándo se guardó el perfil en caché (asígnale "not cached" inicialmente en el constructor). Tu clase necesita:
    • __serialize(): Devuelve un array que contiene únicamente userId, username y email. accessToken contiene información sensible y nunca debe serializarse. La marca de tiempo cachedAt se regenerará al restaurar.
    • __unserialize(): Restaura userId, username y email a partir del array de datos. Establece accessToken en "expired" (ya que los tokens no deberían persistir).
    • getInfo(): Devuelve una cadena con el formato: "[username] ([email]) - Token: [accessToken] - Cached: [cachedAt]"
  • main.php: Incluye el archivo UserProfile. Recibirás cuatro entradas: un ID de usuario, un nombre de usuario, un correo electrónico y un token de acceso. Crea una instancia de UserProfile con estos valores. Imprime tres líneas:
    • La información del perfil original (antes de la serialización)
    • Serializa el perfil usando serialize() y después deserialízalo usando unserialize() para crear un perfil restaurado. Imprime la información del perfil restaurado.
    • Imprime "Token preserved: yes" o "Token preserved: no" según si el token del perfil restaurado coincide con el original (pista: no debería coincidir, ya que los tokens caducan al restaurarse)

Este patrón es esencial para almacenar en caché los datos de usuario de forma segura. Quieres guardar la información del perfil, pero nunca conservar credenciales sensibles como los tokens de acceso. Cuando el perfil se restaura desde la caché, el token se marca como caducado, lo que obliga a la aplicación a obtener uno nuevo.

Pruébalo tú mismo

<?php

require_once 'UserProfile.php';

// Leer entradas
$userId = trim(fgets(STDIN));
$username = trim(fgets(STDIN));
$email = trim(fgets(STDIN));
$accessToken = trim(fgets(STDIN));

// TODO: Crea una instancia de UserProfile con los valores de entrada

// TODO: Imprime la información del perfil original (antes de la serialización)

// TODO: Serializa el perfil, luego deserialízalo para crear un perfil restaurado

// TODO: Imprime la información del perfil restaurado

// TODO: Print "Token preserved: yes" or "Token preserved: no"
// dependiendo de si el token del perfil restaurado coincide con el original

?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de PHP online