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);
?>
Sérialisation d'objets
Sérialiser des objets - des objets en session
serialize() retourne une chaîne de caractères contenant une représentation linéaire de n'importe quelle valeur qui peut être stockée en PHP. unserialize() utilise cette chaîne de caractères pour recréer l'original de la variable à partir de sa représentation linéaire. Utiliser serialize() pour sauvegarder un objet conservera toutes ses variables. Ses méthodes ne seront pas conservées, seulement le nom de la classe.
Afin de pouvoir désérialiser (unserialize()) un objet, la classe de l'objet doit être définie pour permettre sa reconstruction. En d'autres termes, si vous avez un objet de la classe A et le sérialisez, la représentation linéaire obtenue dépendra de la classe A et contiendra toutes ses variables. Si vous voulez désérialiser la représentation linéaire dans un endroit où la classe A n'est pas définie (dans un autre fichier par exemple), alors vous devrez redéclarer la classe A avant de procéder à la désérialisation de la représentation linéaire. Cela peut-être fait, par exemple, en incluant le fichier de définition de la classe ou en utilisant la fonction spl_autoload_register().
<?php
// class_a.inc.php:
class A {
public $one = 1;
public function show_one() {
echo $this->one;
}
}
// page1.php:
include("class_a.inc.php");
$a = new A;
$s = serialize($a);
// enregistre $s quelque part où page2.php peut le retrouver
file_put_contents('store', $s);
// page2.php:
// nous avons besoin de la définition de la classe
// pour qu'unserialize() fonctionne
include("class_a.inc.php");
$s = file_get_contents('store');
$a = unserialize($s);
// appel de show_one() sur l'objet $a, affiche 1
$a->show_one();
?>
Si une application utilise le système de sessions et enregistre des objets, ces objets sont sérialisés automatiquement à la fin de chaque page PHP, et sont désérialisés automatiquement à chaque page suivante. Cela signifie qu'une fois mis en session, chaque objet peut apparaître dans n'importe quelle page de l'application où la session est démarrée. Notez cependant que la fonction session_register() est supprimée depuis PHP 5.4.0
Si une application sérialise des objets, il est fortement recommandé, pour son usage futur, que l'application inclut les définitions de classe des objets sérialisés à chaque page. Ne pas faire ainsi aboutirait à un objet désérialisé sans sa définition de classe. PHP donnerait alors à cet objet une classe de type __PHP_Incomplete_Class_Name, qui n'a pas de méthode et produirait un objet inutile.
Dans l'exemple ci-dessus, si $a est enregistré dans la session en exécutant session_register("a"), vous devriez inclure le fichier class_a.inc.php dans toutes vos pages, et non seulement dans page1.php et page2.php
Note that static members of an object are not serialized.
