Usando __sleep() en PHP 7

La serialización de objetos es otro aspecto importante de la POO. PHP proporciona una función serialize() que nos permite serializar un valor que se le pasa. El resultado es una cadena que contiene una representación de flujo de bytes de cualquier valor que pueda almacenarse en PHP. Serializar los tipos de datos escalares y los objetos simples es bastante sencillo, según el siguiente ejemplo:

<?php
$age = 34;
$name = 'John';
$obj = new stdClass();
$obj->age = 34;
$obj->name = 'John';
var_dump(serialize($age));
var_dump(serialize($name));
var_dump(serialize($obj));

La salida resultante se muestra de la siguiente manera:

string(5) "i:34;"
string(11) "s:4:"John";"
string(56) "O:8:"stdClass":2:{s:3:"age";i:34;s:4:"name";s:4:"John";}"

Incluso una simple clase personalizada se puede serializar fácilmente:

<?php
class User
{
public $name = 'John';
private $age = 34;
protected $salary = 4200.00;
}
$user = new User();
var_dump(serialize($user));

El código anterior da como resultado el siguiente resultado:

string(81)
"O:4:"User":3:{s:4:"name";s:4:"John";s:9:"Userage";i:34;s:9:"*salary";d:420
0;}"

El problema ocurre cuando nuestras clases tienen un tamaño significativo o contienen referencias de tipo de recurso. El método mágico __sleep() aborda estos desafíos de alguna manera. Su uso previsto es confirmar los datos pendientes o realizar tareas de limpieza relacionadas. La función es útil cuando tenemos objetos grandes que no necesitan ser serializados por completo.
La función serialize() activa el método __sleep() del objeto si existe. La activación real se realiza antes de que comience el proceso de serialización. Esto permite que el objeto enumere específicamente los campos que desea permitir para la serialización. El valor de retorno del método __sleep() debe ser una matriz con los nombres de todas las propiedades del objeto que quiere serializar. Si el método no devuelve una matriz de nombre de propiedad serializable, NULL se serializa y se emite E_NOTICE.

El siguiente ejemplo muestra una clase User simple con una implementación simple del método __sleep():

<?php
class User
{
public $name = 'John';
private $age = 34;
protected $salary = 4200.00;
public function __sleep()
{
// Cleanup & other operations???
return ['name', 'salary'];
}
}
$user = new User();
var_dump(serialize($user));

La implementación del método __sleep() establece claramente que las únicas dos propiedades serializables de una clase de usuario son name y salary. Observe cómo los nombres reales se proporcionan como una cadena, sin un signo $, lo que da como resultado una salida de la siguiente manera:

string(60) "O:4:"User":2:{s:4:"name";s:4:"John";s:9:"*salary";d:4200;}"

Serializar objetos para almacenarlos en una base de datos es una práctoca peligrosa, y debe evitarse por cualquier medio posible. Son raros los casos que requieren la serialización de objetos complejos. Incluso esos son probablemente una marca de diseño de aplicación incorrecto.

Comparte