PHP 5.4.33 Released

Serialización de objetos

serialización de objetos - objetos en sesiones

La función serialize() devuelve un string que contiene un flujo de bytes que representa cualquier valor que se pueda almacenar en PHP. Por otra parte, unserialize() puede restaurar los valores originales a partir de dicho string. Al utilizar serialize para guardar un objeto, almacenará todas las variables de dicho objeto. En cambio los métodos no se guardarán, sólo el nombre de la clase.

Para poder deserializar (unserialize()) un objeto, debe estar definida la clase de ese objeto. Es decir, si se tiene un objeto de la clase A, y lo serializamos, se obtendrá un string que haga referencia a la clase A y contenga todas las variables que haya en esta clase. Si se desea deseralizar en otro fichero, antes debe estar presente la definición de la clase A. Esto se puede hacer, por ejemplo, escribiendo la definición de la clase A en un fichero, para después o bien incluirlo, o bien hacer uso de la función spl_autoload_register().

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

  
include("classa.inc");
  
  
$a = new A;
  
$s serialize($a);
  
// almacenamos $s en algún lugar en el que page2.php puede encontrarlo.
  
file_put_contents('store'$s);

// page2.php:
  
  // se necesita para que unserialize funcione correctamente.
  
include("classa.inc");

  
$s file_get_contents('store');
  
$a unserialize($s);

  
// now use the function show_one() of the $a object.  
  
$a->show_one();
?>

Si una aplicación está usando sesiones, y utiliza session_register() para registrar objetos, estos objetos se serializarán automáticamente al final de cada página PHP, y se deserializan también automáticamente en cada una de las siguientes peticiones. Esto significa que, una vez que formen parte de la sesión, estos objetos se podrán utilizar en cualquier página de la aplicación. Sin embargo, la función session_register(): ha sido borrada a partir de PHP 5.4.0

Si una aplicación serializa objetos para su uso posterior, se recomienda encarecidamente que se incluya la definición de la clase en toda la aplicación. Si no se hiciera, se deserializaría el objeto sin una definición de clase, lo cual daría como resultado que PHP definiera al objeto con la clase __PHP_Incomplete_Class_Name, que no tiene métodos, haciendo que el objeto no fuera útil.

Por tanto, si en el ejemplo anterior $a se guardara en una sesión mediante session_register("a"), sería necesario incluir el fichero classa.inc en todas las páginas, no sólo en page1.php y page2.php.

Más allá del consejo de arriba, observe que también se puede conectar con eventos de serialización y deserialización sobre un objeto usando los métodos __sleep() y __wakeup(). El uso de __sleep() también permite serializar únicamente un subconjunto de propiedades de objetos.

add a note add a note

User Contributed Notes 2 notes

up
40
php at lanar dot com dot au
4 years ago
Note that static members of an object are not serialized.
up
-24
wbcarts at juno dot com
4 years ago
PHP OBJECT SERIALIZATION

I use a database to store info rather than storing PHP Objects themselves. However, I find that having a PHP Object acting as an interface to my db is way useful. For example, suppose I have a TABLE called 'user' that looks like this.

CREATE TABLE user {
  user_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  user_first VARCHAR(24) NOT NULL,
  user_last VARCHAR(24) NOT NULL,
  PRIMARY KEY (user_id)
);

Then I would create a PHP Class definition like so:

<?php

require('includes/db_connect.php');

class
User
{
  protected
$user_id;
  protected
$user_first;
  protected
$user_last;

  public function
__construct($id, $first, $last)
  {
   
$this->user_id = $id;
   
$this->user_first = $first;
   
$this->user_last = $last;
  }

 
# FUNCTIONS TO RETRIEVE INFO - DESERIALIZE.
 
public static function db_user_by_id($dbc, $id)
  {
   
$query = "SELECT * FROM user WHERE user_id=$id LIMIT 1";
    return
User::db_select($dbc, $query);
  }

  public static function
db_user_by_name($dbc, $first, $last)
  {
   
$query = "SELECT * FROM user WHERE user_first='$first' AND user_last='$last' LIMIT 1";
    return
User::db_select($dbc, $query);
  }

  protected static function
db_select($dbc, $query);
  {
   
$result = mysqli_query($dbc, $query);
    if(
mysqli_num_rows($result) > 0)
    {
     
$row = mysqli_fetch_array($result, MYSQLI_NUM);
      return new
User($row[0], $row[1], $row[2]);
    }
  }

 
# FUNCTIONS TO SAVE INFO - SERIALIZE.
 
public function insert($dbc)
  {
   
$query = "INSERT INTO user VALUES (NULL, '$this->user_first', '$this->user_last')";
   
$result = mysqli_query($dbc, $query);
  }

  public function
update($dbc)
  {
   
$query = "UPDATE user SET user_first='$this->user_first', user_last='$this->user_last' WHERE user_id=$this->id LIMIT 1";
   
$result = mysqli_query($dbc, $query);
  }

 
# GETTER and SETTER FUNCTIONS - DO NOT ALLOW SETTING OF ID
 
public function getId() {return $this->user_id;)
  public function
getFirst() {return $this->user_first;)
  public function
getLast() {return $this->user_last;)
  public function
setFirst($first) {$this->user_first = $first;}
  public function
setLast($last) {$this->user_last = $last;}

 
# CUSTOM FUNCTIONS
 
public function getFullName() {return $this->user_first . ' ' . $this->user_last;}
  public function
getLastFirst() {return $this->user_last . ', ' . $this->user_first;}
}

?>

Using PHP Objects for SERIALIZATION and DESERIALIZATION is now super-easy, for example:

<?php

require('User.php');

// INSERT a new user.
$user = new User(0, 'Frank', 'American');
$user->insert($dbc);  // done!

// UPDATE an existing user.
$user = User::db_user_by_id($dbc, 223);
$user->setFirst('Johnny');
$user->update($dbc);  // done!

mysqli_close($dbc);

?>
To Top