Sérialisation d'objets en PHP : des bases aux techniques avancées
La sérialisation est le processus de conversion de structures de données complexes (objets, tableaux) en un format linéaire adapté au stockage ou à la transmission. En PHP, ce mécanisme est particulièrement important pour conserver l'état des objets entre les requêtes, transmettre des données via une API ou les enregistrer dans des bases de données. Dans cet article, nous allons détailler tous les aspects de la sérialisation en PHP.
Qu'est-ce que la sérialisation et pourquoi en a-t-on besoin ?
La sérialisation permet de "figer" un objet en une chaîne, puis de le restaurer. Cela est utile dans les scénarios suivants :
- Sauvegarde des sessions utilisateur (PHP sérialise automatiquement les données de session)
- Mise en cache d'objets complexes dans Redis ou Memcached
- Transmission d'objets entre microservices
- Stockage de configurations dans des fichiers
- Débogage et journalisation de l'état des objets
Sérialisation de base : serialize() et unserialize()
PHP fournit deux fonctions principales pour travailler avec la sérialisation :
<?phpclass User { public $name; public $email; private $password;
public function __construct($name, $email, $password) { $this->name = $name; $this->email = $email; $this->password = $password; }}
$user = new User('Иван Петров', 'ivan@example.com', 'secret123');$serialized = serialize($user);echo $serialized;// Affichage : O:4:"User":3:{s:4:"name";s:11:"Иван Петров";s:5:"email";s:16:"ivan@example.com";s:14:"\\0User\\0password";s:9:"secret123";}
// Restauration de l'objet$unserialized = unserialize($serialized);echo $unserialized->name; // Иван Петров?>Important : La fonction serialize() traite toutes les propriétés de l'objet, y compris les propriétés privées et protégées. Les propriétés privées sont encodées avec le préfixe \\0ClassName\\0, les propriétés protégées avec \\0*\\0.
Méthodes magiques __sleep() et __wakeup()
Pour contrôler le processus de sérialisation, PHP fournit deux méthodes magiques :
- __sleep() — appelée avant la sérialisation. Doit retourner un tableau des noms des propriétés à sérialiser.
- __wakeup() — appelée après la désérialisation. Utilisée pour réinitialiser les ressources (par exemple, les connexions à la base de données).
<?phpclass DatabaseConnection { private $connection; private $dsn; private $username; private $password; private $cache = [];
public function __construct($dsn, $username, $password) { $this->dsn = $dsn; $this->username = $username; $this->password = $password; $this->connect(); }
private function connect() { // Simulation de connexion à la base de données $this->connection = new stdClass(); $this->connection->connected = true; }
public function __sleep() { // Ne pas sérialiser la ressource de connexion et le mot de passe return ['dsn', 'username', 'cache']; }
public function __wakeup() { // Restaurer la connexion après désérialisation $this->connect(); }}
$db = new DatabaseConnection('mysql:host=localhost;dbname=test', 'root', 'pass');$serialized = serialize($db);$restored = unserialize($serialized);?>Sérialisation en JSON : json_encode() et json_decode()
JSON est un format plus universel, pris en charge par de nombreux langages de programmation. En PHP, les fonctions json_encode() et json_decode() sont utilisées pour la sérialisation en JSON.
<?phpclass Product { public $id; public $name; public $price;
public function __construct($id, $name, $price) { $this->id = $id; $this->name = $name; $this->price = $price; }}
$product Aussi dans la bibliothèque
Moq pour C# (.NET) : guide complet avec exemples
Générateur de QR codes en Go (Golang) avec la bibliothèque go-qrcode
Mise en cache en Rust : Redis, Memcached et solutions intégrées
Conteneurs d'injection de dépendances en Rust : aperçu et implémentation avec l'exemple de « dicy »
Travailler avec Excel en Rust : bibliothèques pour la lecture et l'écriture