He trabajado con PHP desde hace unos años, pero hasta ahora nunca tuve la necesidad de tratar la serialización explícitamente, solo usando el $_SESSION
. Ahora tengo un proyecto que requiere que implemente manualmente el mecanismo de serialización para ciertos datos, y me doy cuenta de que el problema también se aplica al $_SESSION
.¿Propiedades "transitorias" en una clase de PHP?
Tengo una clase que contiene una serie de propiedades. La mayoría de estas propiedades son pequeñas (como en el consumo de memoria): números, cadenas relativamente cortas, etc. Sin embargo, la clase también contiene algunas propiedades, que pueden contener matrices ENORMES (por ejemplo, un volcado completo de una tabla de base de datos: 100.000 filas con 100 campos cada una) Da la casualidad de que esta es una de las clases que necesita ser serializada/deserializada y, afortunadamente, las propiedades que contienen grandes matrices no necesitan ser serializadas, ya que son esencialmente piezas temporales de trabajo y se reconstruyen de todos modos según sea necesario.
En tales circunstancias en Java, simplemente declararía la propiedad como transient
- y se omitirá de la serialización. Desafortunadamente, PHP no es compatible con tales calificadores.
Una forma de tratar es que tenga algo como esto:
class A implements Serializable
{
private $var_small = 1234;
private $var_big = array(...); //huge array, of course, not init in this way
public function serialize()
{
$vars = get_object_vars($this);
unset($vars['var_big']);
return serialize($vars);
}
public function unserialize($data)
{
$vars = unserialize($data);
foreach ($vars as $var => $value) {
$this->$var = $value;
}
}
}
Sin embargo, esto es bastante engorroso, ya que tendría que actualizar serialize
método cada vez que agregar otra propiedad transitoria. Además, una vez que la herencia entra en juego, esto se vuelve aún más complicado, ya que las propiedades transitorias pueden estar tanto en la subclase como en la matriz. Lo sé, todavía es factible, sin embargo, preferiría delegar tanto como sea posible en el idioma en lugar de reinventar la rueda.
Entonces, ¿cuál es la mejor manera de lidiar con las propiedades transitorias? ¿O me estoy perdiendo algo y PHP lo admite de la caja?
'__sleep' no funcionará con propiedades privadas en la clase principal, por lo que solo será útil siempre que la herencia no esté involucrada. –
@AleksG ha! ¡Tengo una solución que funciona! Echa un vistazo :) – Vyktor
Gracias, parece un enfoque viable. Voy a experimentar un poco más con esto para ver cómo funciona. –