PHP 5.6.0RC3 is available

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 3 notes

up
38
php at lanar dot com dot au
4 years ago
Note that static members of an object are not serialized.
up
0
me at iabdullah dot info
8 days ago
In case you're reading the official book that written by Rasmus and the other authors, Here is the serialization and unserialization Example (6-3) since it is written in the old fashion way (using session_register() ..) and has some typos.

(Log.php)
an object class, Log, provides two useful methods: write() to append a message to the logfile, and read() to fetch the current contents of the logfile. It uses __wakeup() to reopen the logfile and __sleep() to close the logfile.

<?php
class Log {
    private
$filename;
    private
$fh;

    public function
__construct ($fn)
    {
       
$this->filename = $fn;
       
$this->open();
    }

    public function
open ()
    {
       
$this->fh = fopen ($this->filename,'a') or die ("Can't open {$this->filename} !");
    }
    public function
write ($note)
    {
       
fwrite($this->fh, "{$note}\n");
    }
    public function
read ()
    {
        return
join ('', file($this->filename));
    }
    public function
__wakeup()
    {
       
$this->open();
    }
    public function
__sleep ()
    {
       
fclose ($this->fh);
        return array(
"filename");
    }
}
?>
Store the Log class definition in a file called Log.inc.

(front.php)
The front.php uses the Log class and PHP sessions to create a persistent log variable, $Logger.
<?php
include_once ("Serialization.php");
session_start();
?>
<html>
<head>
<title>Front Page</title>
</head>
<body>
<?php
$now
= strftime("%c");   

if (!isset(
$_SESSION['Logger']))
{
   
$l = new Log ("tmp/persistent_log");
   
$_SESSION['Logger'] = $l;
   
$l->write("Created {$now}");

    echo (
"<p> Created Session and Persistent Log File </p>");
}
else
{
   
$_SESSION['Logger']->write("Viewed Page 1 at {$now}");
    echo
"<p> The Log content : </p>";
    echo
nl2br($_SESSION['Logger']->read());
}
?>
<a href="next.php"> Move the next Page !!</a>
</body>
</html>

(next.php)
The file next.php shows , an HTML page, Following the link from the front page to this page triggers the loading of the persistent object $logger. The __wakeup() call reopens the logfile so the object is ready to be used.
<?php
include_once ("Serialization.php");
session_start();
?>
<html>
<head>
<title>Next Page</title>
</head>
<body>
<?php
$now
= strftime("%c");   
$logger = $_SESSION['Logger'];

$logger->write("Viewed Page 2 at {$now}");
echo
"<p> The Log content : </p>";
echo
nl2br($logger->read());
?>
</body>
</html>

Create folder 'tmp' and file 'persistent_log' to avoid getting fopen warning error message.
up
-23
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