Aller au contenu principal

Sérialisation des objets

Schéma

Petite vérification​

Avant de commencer, vérifiez si vous savez...

  1. écrire la déclaration de la constante FORCE_MAX valant 100 à l'intérieur d'une classe Guerrier (avec le mot-clé qui convient)
  2. prédire l'affichage produit par le code suivant, sachant que afficherForceMax() utilise static::FORCE_MAX
abstract class Personnage {
const FORCE_MAX = 0;
public static function afficherForceMax() {
print("Force max : " . static::FORCE_MAX . "\n");
}
}
class Guerrier extends Personnage {
const FORCE_MAX = 100;
}
Guerrier::afficherForceMax();
  1. expliquer la différence entre self::FORCE_MAX et static::FORCE_MAX dans une méthode héritée par plusieurs classes filles
📌 Réponse attendue

Notions théoriques​

La sérialisation est un processus qui nous permet de convertir un objet en une chaîne de caractères, ce qui peut être très utile pour le stockage ou la transmission d'informations.

En PHP, nous utilisons les fonctions serialize() et unserialize() pour gérer ce processus :

  • serialize($object) va transformer l'objet $object en une chaîne de caractères que nous pouvons ensuite stocker dans un fichier ou une base de données.

  • unserialize($string) va transformer la chaîne $string (qui a été générée par serialize()) en retour à sa forme d'objet original.

C'est un moyen efficace de stocker l'état actuel d'un objet pour une utilisation ultérieure.

Exemple pratique​

class Guerrier {
public $nom;
public $force;

public function __construct($nom, $force) {
$this->nom = $nom;
$this->force = $force;
}
}

$guerrier1 = new Guerrier("Conan", 100);

// Sérialisation
$guerrier_serialise = serialize($guerrier1);
file_put_contents('guerrier.txt', $guerrier_serialise);

// Désérialisation
$guerrier_recupere = file_get_contents('guerrier.txt');
$guerrier2 = unserialize($guerrier_recupere);

print($guerrier2->nom); // Affiche "Conan"

Dans cet exemple, nous créons un guerrier, le sérialisons et le stockons dans un fichier. Ensuite, nous récupérons ces informations du fichier, le désérialisons et affichons son nom.

Test de mémorisation/compréhension​


Que fait la sérialisation ?


Pourquoi utiliserions-nous la sérialisation ?


Où pouvez-vous stocker un objet sérialisé ?


Quelle fonction PHP est utilisée pour sérialiser un objet ?


Quelle fonction PHP est utilisée pour désérialiser une chaîne ?



TP pour réfléchir et résoudre des problèmes​

Créez une classe Magicien avec des propriétés nom et magie. Créez un mage, sérialisez-le et stockez-le dans un fichier. Récupérez ensuite le mage du fichier, désérialisez-le et affichez ses propriétés.

Voici les étapes détaillées pour réaliser le TP :

  1. Création de la classe Magicien : Commencez par créer une nouvelle classe appelée Magicien. Cette classe doit avoir deux propriétés publiques : nom et magie.

  2. Ajout d'un constructeur à la classe Magicien : Ajoutez un constructeur à la classe Magicien. Ce constructeur doit prendre deux paramètres ($nom et $magie) qui sont utilisés pour initialiser les propriétés nom et magie.

  3. Création d'une instance de la classe Magicien : Créez une nouvelle instance de la classe Magicien, en passant les valeurs appropriées pour le nom et la magie.

  4. Sérialisation de l'objet Magicien : Utilisez la fonction serialize() pour transformer l'objet Magicien en une chaîne de caractères.

  5. Stockage de l'objet sérialisé dans un fichier : Utilisez la fonction file_put_contents() pour écrire la chaîne sérialisée dans un fichier. Vous pouvez nommer ce fichier "mage.txt".

  6. Récupération de l'objet sérialisé du fichier : Utilisez la fonction file_get_contents() pour lire le contenu du fichier "mage.txt" dans une variable.

  7. Désérialisation de l'objet Magicien : Utilisez la fonction unserialize() pour transformer la chaîne récupérée du fichier en un objet Magicien.

  8. Affichage des propriétés de l'objet Magicien : Utilisez l'instruction print pour afficher les propriétés nom et magie de l'objet Magicien.


Bonne pratique - Sérialisation

serialize() produit un format PHP propriétaire — uniquement lisible par PHP. Pour échanger des données avec d'autres systèmes (JavaScript, Python, API REST), préférer json_encode() / json_decode(). Attention : unserialize() sur des données non fiables (venant d'un utilisateur ou d'un réseau) est une faille de sécurité connue — utiliser json_decode() à la place dans ce cas.

📌 Une solution