Serialización de objetos en PHP: desde lo básico hasta técnicas avanzadas
La serialización es el proceso de convertir estructuras de datos complejas (objetos, arrays) en un formato lineal, adecuado para almacenamiento o transmisión. En PHP, este mecanismo es especialmente importante para preservar el estado de los objetos entre solicitudes, transferir datos a través de API o guardarlos en bases de datos. En este artículo, analizaremos en detalle todos los aspectos de la serialización en PHP.
¿Qué es la serialización y para qué sirve?
La serialización permite "congelar" un objeto en una cadena y luego restaurarlo. Esto es útil en los siguientes escenarios:
- Guardar sesiones de usuario (PHP serializa automáticamente los datos de la sesión)
- Almacenar en caché objetos complejos en Redis o Memcached
- Transferir objetos entre microservicios
- Almacenar configuraciones en archivos
- Depuración y registro del estado de objetos
Serialización básica: serialize() y unserialize()
PHP proporciona dos funciones principales para trabajar con la 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 Petrov', 'ivan@example.com', 'secret123');$serialized = serialize($user);echo $serialized;// Salida: O:4:"User":3:{s:4:"name";s:11:"Iván Petrov";s:5:"email";s:16:"ivan@example.com";s:14:"\\0User\\0password";s:9:"secret123";}
// Restauración del objeto$unserialized = unserialize($serialized);echo $unserialized->name; // Iván Petrov?>Importante: La función serialize() procesa todas las propiedades del objeto, incluidas las privadas y protegidas. Las propiedades privadas se codifican con el prefijo \\0ClassName\\0, las protegidas con \\0*\\0.
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.
- __wakeup() — se llama después de la deserialización. Se utiliza para reinicializar recursos (por ejemplo, conexiones a la base de datos).
<?phpclass DatabaseConnection { private $connection; private $dsn; private $username; private $password; private $cache = [];
public function __construct($dsn, $username, $password) { $this->dsn = $dsn; $this->username = $username; $this->password = $password; $this->connect(); }
private function connect() { // Simulación de conexión a la base de datos $this->connection = new stdClass(); $this->connection->connected = true; }
public function __sleep() { // No serializamos el recurso de conexión ni la contraseña return ['dsn', 'username', 'cache']; }
public function __wakeup() { // Restauramos la conexión después de la deserialización $this->connect(); }}
$db = new DatabaseConnection('mysql:host=localhost;dbname=test', 'root', 'pass');$serialized = serialize($db);$restored = unserialize($serialized);?>Serialización en JSON: json_encode() y json_decode()
JSON es un formato más universal, compatible con muchos lenguajes de programación. En PHP, para la serialización en JSON se utilizan las funciones json_encode() y json_decode().
<?phpclass Product { public $id; public $name; public $price;
public function __construct($id, $name, $price) { $this->id = $id; $this->name = $name; $this->price = $price; }}
$product