Sérialisation d'objets en PHP : fonctions, méthodes et exemples pratiques

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sérialisation d'objets en PHP : guide complet

\n\n

La sérialisation est le processus de conversion de structures de données complexes (objets, tableaux) en une chaîne ou un format binaire pouvant être sauvegardé dans un fichier, transmis sur un réseau ou mis en cache. En PHP, ce mécanisme est implémenté par les fonctions intégrées serialize() et unserialize(). Dans cet article, nous allons détailler le fonctionnement de la sérialisation d'objets, les pièges à éviter et comment utiliser les méthodes magiques pour un réglage fin du processus.

\n\n

Fonctions principales de sérialisation

\n\n

PHP fournit deux fonctions clés pour travailler avec la sérialisation :

\n\n
    \n
  • serialize($value) — convertit une valeur (sauf resource) en une chaîne prête à être stockée. Pour les objets, le nom de la classe et toutes les propriétés (y compris privées et protégées) sont conservés.
  • \n
  • unserialize($string) — restaure la valeur d'origine à partir de la chaîne. Pour les objets, le constructeur de la classe est automatiquement appelé (s'il est défini) et les propriétés sauvegardées sont injectées.
  • \n
\n\n

Exemple simple de sérialisation d'objet

\n\n

Considérons une classe de base User et sa sérialisation :

\n\n
<?php\nclass User {\n    public $name;\n    public $email;\n    private $password;\n\n    public function __construct($name, $email, $password) {\n        $this->name = $name;\n        $this->email = $email;\n        $this->password = $password;\n    }\n}\n\n$user = new User('Ivan', 'ivan@example.com', 'secret123');\n$serialized = serialize($user);\necho $serialized;\n// Affichage : O:4:"User":3:{s:4:"name";s:8:"Ivan";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}\n?>
\n\n

Remarque : la propriété privée $password apparaît dans la chaîne sous la forme \\0User\\0password — c'est une notation spéciale pour les champs privés, où \\0 est un octet nul.

\n\n

Restauration d'un objet à partir d'une chaîne sérialisée

\n\n
<?php\n$serialized = 'O:4:"User":3:{s:4:"name";s:8:"Ivan";s:5:"email";s:16:"ivan@example.com";s:12:"\\0User\\0password";s:9:"secret123";}';\n$user = unserialize($serialized);\necho $user->name; // Ivan\necho $user->email; // ivan@example.com\n// La propriété privée password est également restaurée, mais inaccessible directement\n?>
\n\n

Important : Lors de la désérialisation, PHP tente de charger la classe si elle n'est pas encore définie. Si la classe n'existe pas, une instance de la classe intégrée __PHP_Incomplete_Class est créée.

\n\n

Méthodes magiques __sleep() et __wakeup()

\n\n

Pour contrôler le processus de sérialisation, PHP fournit deux méthodes magiques :

\n\n
    \n
  • __sleep() — appelée avant la sérialisation. Doit retourner un tableau des noms de propriétés à sérialiser. Utile pour fermer les connexions à la base de données, libérer des ressources ou masquer des données confidentielles.
  • \n
  • __wakeup() — appelée immédiatement après la désérialisation. Utilisée pour se reconnecter à la base de données, restaurer des ressources ou vérifier l'intégrité des données.
  • \n
\n\n

Exemple avec __sleep() et __wakeup()

\n\n
<?php\nclass DatabaseConnection {\n    private $host;\n    private $user;\n    private $password;\n    private $connection;\n\n    public function __construct($host, $user, $password) {\n        $this->host = $host;\n        $this->user = $user;\n        $this->password = $password;\n        $this->connect();\n    }\n\n    private function connect() {\n        // Simulation de connexion\n        $this->connection = "Ressource de connexion à {$this->host}";\n    }\n\n    public function __sleep() {\n        // Ne pas sérialiser la ressource de connexion, seulement les données pour la reconnexion\n        return ['host', 'user', 'password'];\n    }\n\n    public function __wakeup() {\n        // Restaurer                    

Recommendations