PHP 8.4.0 RC4 available for testing

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() peut utiliser cette chaîne de caractères pour recréer la valeur originale 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, seul le nom de la classe le sera.

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 fera référence à la classe A et contiendra toutes ses variables. Si vous voulez pouvoir désérialiser cette 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 sa 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
// A.php :

class A {
public
$one = 1;

public function
show_one() {
echo
$this->one;
}
}

// page1.php :

include "A.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 "A.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 sérialise des objets, il est fortement recommandé, pour son usage futur, que l'application inclut les définitions des classes des objets sérialisés à chaque page. Ne pas faire ainsi pourrait aboutir à 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.

Ainsi, dans l'exemple ci-dessus, si $a était enregistré dans la session en ajoutant une clé à la variable super-globale $_SESSION, vous devriez inclure le fichier A.php dans toutes vos pages, et pas seulement dans page1.php et page2.php

Notez que vous pouvez également utiliser les événements de sérialisation et de désérialisation sur un objet en utilisant les méthodes __sleep() et __wakeup(). L'utilisation de __sleep() vous permet également de seulement sérialiser une partie des propriétés de l'objet.

add a note

User Contributed Notes 3 notes

up
235
php at lanar dot com dot au
15 years ago
Note that static members of an object are not serialized.
up
34
michael at smith-li dot com
9 years ago
Reading this page you'd be left with the impression that a class's `serialize` and `unserialize` methods are unrelated to the `serialize` and `unserialize` core functions; that only `__sleep` and `__unsleep` allow you to customize an object's serialization interface. But look at http://php.net/manual/en/class.serializable.php and you'll see that there is a more straightforward way to control how a user-defined object is serialized and unserialized.
up
8
Anonymous
3 years ago
Until such time as these documents are updated, note that `session_register()` is not needed to automatically serialize & unserialize objects in sessions. Any objects in `$_SESSION` are serialized when the session is closed (via `session_write_close()` or upon script exit) & unserialized when opened (via `session_start()`). The note about including classes throughout an app (either by including the definition globally or autoloading it) still holds.
To Top