Serialización de objetos en PHP: guía completa
La serialización es el proceso de convertir estructuras de datos complejas (objetos, arrays) en una cadena o formato binario que se puede guardar en un archivo, transmitir por red o almacenar en caché. En PHP, este mecanismo se implementa mediante las funciones integradas serialize() y unserialize(). En este artículo, analizaremos en detalle cómo funciona la serialización de objetos, qué dificultades existen y cómo usar los métodos mágicos para ajustar el proceso.
Funciones principales de serialización
PHP proporciona dos funciones clave para trabajar con la serialización:
serialize($value)— convierte un valor (excepto resource) en una cadena adecuada para almacenamiento. Para objetos, se guarda el nombre de la clase y todas las propiedades (incluidas las privadas y protegidas).unserialize($string)— restaura el valor original a partir de una cadena. Para objetos, se llama automáticamente al constructor de la clase (si está definido) y se asignan las propiedades guardadas.
Ejemplo simple de serialización de un objeto
Consideremos una clase básica User y su serialización:
<?phpclass User { public $name; public $email; private $password;
public function __construct($name, $email, $password) { $this->name = $name; $this->email = $email; $this->password = $password; }}
$user = new User('Iván', 'ivan@example.com', 'secret123');$serialized = serialize($user);echo $serialized;// Salida: O:4:"User":3:{s:4:"name";s:8:"Iván";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}?>Tenga en cuenta: la propiedad privada $password en la cadena aparece como \\0User\\0password — esta es una notación especial para campos privados, donde \\0 es el byte nulo.
Restauración de un objeto a partir de una cadena serializada
<?php$serialized = 'O:4:"User":3:{s:4:"name";s:8:"Iván";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}';$user = unserialize($serialized);echo $user->name; // Ivánecho $user->email; // ivan@example.com// La propiedad privada password también se restaura, pero no es accesible directamente?>Importante: Al deserializar, PHP intenta cargar la clase si aún no está definida. Si la clase no existe, se creará una instancia de la clase integrada __PHP_Incomplete_Class.
Métodos mágicos __sleep() y __wakeup()
Para controlar el proceso de serialización, PHP proporciona dos métodos mágicos:
__sleep()— se llama antes de la serialización. Debe devolver un array con los nombres de las propiedades que se deben serializar. Es útil para cerrar conexiones a la base de datos, liberar recursos u ocultar datos confidenciales.__wakeup()— se llama inmediatamente después de la deserialización. Se utiliza para reconectar a la base de datos, restaurar recursos o verificar la integridad de los datos.
Ejemplo con __sleep() y __wakeup()
<?phpclass DatabaseConnection { private $host; private $user; private $password; private $connection;
public function __construct($host, $user, $password) { $this->host = $host; $this->user = $user; $this->password = $password; $this->connect(); }
private function connect() { // Simulación de conexión $this->connection = "Recurso de conexión a {$this->host}"; }
public function __sleep() { // No serializamos el recurso de conexión, solo los datos para reconectar return ['host', 'user', 'password']; }
public function __wakeup() { // Restaura También en la biblioteca
Trabajo con imágenes en Go: redimensionar y recortar con la librería imaging
Colas de tareas para JavaScript (Node.js): Bull, Bee-Queue, Kue