Forum und email

Seriación de objetos, objetos en sesiones

Note: En PHP 3, los objetos perdían su asociación de clase a lo largo del proceso de seriación y decodificación. La variable resultante es de tipo objeto, pero no tiene clase ni métodos, de modo que es inútil (se ha convertido en algo como una matriz con una sintaxis curiosa).

Caution

La siguiente información es válida para PHP >= 4 únicamente.

serialize() devuelve una cadena que contiene una representación tipo secuencia-de-bytes de cualquier valor que pueda ser almacenado en PHP. unserialize() puede causar que estas cadenas recreen los valores de variable originales. Usando el método de seriación para guardar un objeto guardará todas las variables en un objeto. Las funciones en un objeto no se guardarán, sólo el nombre de la clase.

Para poder usar unserialize() con un objeto, la clase de ese objeto necesita ser definida. Es decir, si tiene un objeto $a de la clase A en pagina1.php y codifica ésta variable, obtendrá una cadena que hace referencia a la clase A y contiene todos los valores de variables contenidas en $a. Si desea tener la capacidad de revertir el proceso de seriación en pagina2.php, recreando $a de la clase A, la definición de la clase A debe estar presente en pagina2.php. Esto puede conseguirse por ejemplo almacenando la definición de la clase A en un archivo de inclusión e incluyéndolo tanto en pagina1.php como en pagina2.php.

<?php
// clase_a.inc:

  
class {
      var 
$uno 1;

      function 
mostrar_uno() {
          echo 
$this->uno;
      }
  }

// pagina1.php:

  
include("clase_a.inc");

  
$a = new A;
  
$s serialize($a);
  
// almacenar $s en alguna parte en donde pagina2.php lo pueda encontrar.
  
$fp fopen("almacenamiento""w");
  
fwrite($fp$s);
  
fclose($fp);

// pagina2.php:

  // esto es necesario para revertir la seriación apropiadamente.
  
include("clase_a.inc");

  
$s implode("", @file("almacenamiento"));
  
$a unserialize($s);

  
// ahora use la función mostrar_uno() del objeto $a.
  
$a->mostrar_uno();
?>

Si está usando sesiones y usa session_register() para registrar objetos, estos objetos son seriados automáticamente al final de cada página PHP, y son decodificados de vuelta automáticamente en cada una de las siguientes páginas. Esto quiere decir, básicamente, que tales objetos pueden aparecer en cualquiera de sus páginas una vez hacen parte de su sesión.

Es bastante recomendable que incluya las definiciones de clase de todos esos objetos registrados en todas sus páginas, incluso si no va a usar realmente estas clases en todas sus páginas. Si no lo hace y un objeto está siendo decodificado sin que su definición de clase esté presente, perderá su asociación de clase y se convertirá en un objeto de la clase stdClass sin ninguna función disponible, es decir, se hará prácticamente inútil.

De modo que si en el ejemplo anterior $a se hacía parte de una sesión ejecutando session_register("a"), debería incluírse el archivo clase_a.inc en todas sus páginas, no sólo en pagina1.php y pagina2.php.