PHP Velho Oeste 2024

Serialización de objetos - objetos en las sesiones

serialize() devuelve un string conteniendo una representación de flujo de bytes de cualquier valor que pueda ser almacenado en PHP. unserialize() puede utilizar este string para recrear los valores originales de la variable. Al utilizar serialize para guardar un objeto, se guardarán todas las variables en el objeto. Las las funciones en un objeto no serán guardadas, solamente el nombre de la clase.

Para poder utilizar unserialize() en un objeto, la clase de este objeto debe estar definida. Es decir, si se tiene un objeto $a de la clase A en page1.php y se serializa, se obtiene un string que hace referencia a la clase A y que contiene todos los valores de las variables contenidas en $a. Si se desea ser capáz de revertir la serialización de esto en page2.php, recreando $a de la clase A, la definición de la clase A debe estar presente en page2.php. Esto puede hacerse por ejemplo al colocar la definición de clase de la clase A en un fichero de include e incluyendo este fichero en ambas páginas page1.php y en page2.php.

<?php
// classa.inc:
  
  
class {
      var 
$one 1;
    
      function 
show_one() {
          echo 
$this->one;
      }
  }
  
// page1.php:

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// almacenar $s en algún lado donde page2.php pueda encontrarle.
  
$fp fopen("store""w");
  
fwrite($fp$s);
  
fclose($fp);

// page2.php:
  
  // esto es necesario para que unserialize funcione apropiadamente.
  
include("classa.inc");

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

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

Si se están utilizando sesiones y se emplea session_register() para registrar objetos, estos objetos son serializados automáticamente al final de cada página de PHP, y la serialización les es revertida automáticamente en en cada una de las páginas siguientes. Esto significa básicamente que estos objetos pueden aparecer en cualquiera de las páginas una vez que se vuelven parte de la sesión.

Se recomienda enfáticamente que se incluyan las definiciones de clase de semejantes objetos en todas las páginas, aun si no se usan estas clases en todas las páginas. Si no se hace y a un objeto se le revierte la serialización sin que su definición de clase esté presente, perderá su asociacón de clase y se volverá un objeto de la clase __PHP_Incomplete_Class_Name sin ninguna función disponible por completo, es decir, se volverá bastante inútil.

Así que si en el ejemplo anterior $a se volviese parte de una sesión al ejecutar session_register("a"), se debería incluir el fichero classa.inc en todas las páginas, no sólo en page1.php y en page2.php.

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top