__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.
Desafío
FácilConstruyamos 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 claseUserProfileque 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$cachedAtque 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 únicamenteuserId,usernameyemail.accessTokencontiene información sensible y nunca debe serializarse. La marca de tiempocachedAtse regenerará al restaurar.__unserialize(): RestaurauserId,usernameyemaila partir del array de datos. EstableceaccessTokenen"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 deUserProfilecon 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 usandounserialize()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
?>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
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online