Les méthodes que PHP appelle tout seul à des moments précis — __construct, __destruct, __toString, __get, __set, __isset, __unset, __call, __callStatic, __clone, __invoke — et la sérialisation avec __sleep, __wakeup, __serialize et __unserialize.
1Situer
Afficher un produit avec un simple echo, accepter des propriétés « à la demande » pour une fiche client, garder un panier entre deux visites en le transformant en texte : PHP prévoit des points d'accroche, les méthodes magiques, que la classe peut définir pour réagir à ces situations. Elles commencent toutes par deux tirets bas.
2Comprendre
Les méthodes que PHP appelle tout seul
new Fiche('Amina Benali') : PHP appelle __construct.
1 / 6
Qu’est-ce qu’une méthode magique ?
Méthode
PHP l’appelle quand…
__construct()
l’objet est créé (new)
__destruct()
l’objet est détruit (plus utilisé, ou fin du script)
__toString()
l’objet est utilisé comme une chaîne (echo, concaténation)
__get($nom) / __set($nom, $val)
on lit / écrit une propriété inaccessible ou inexistante
__isset($nom) / __unset($nom)
on appelle isset() / unset() sur une telle propriété
__call($nom, $args) / __callStatic(...)
on appelle une méthode inaccessible / statique inaccessible
__clone()
l’objet est copié avec clone
__invoke(...)
l’objet est appelé comme une fonction : $objet(...)
classPanier
{
privatearray$lignes= [];
private?PDO$pdo=null; // une connexion ne se sérialise paspublicfunction__serialize():array
{
return ['lignes'=>$this->lignes];
}
publicfunction__unserialize(array$data):void
{
$this->lignes=$data['lignes'];
// $this->pdo sera recréée à la première requête
}
}
file_put_contents('panier.txt', serialize($panier));
$panier=unserialize(file_get_contents('panier.txt'));
$_SESSION utilise ce mécanisme : un objet rangé en session est sérialisé à la fin du script et reconstruit au session_start() suivant (la classe doit alors être chargée avantsession_start()).
Exemple simple
Le détecteur de mouvement
Une lampe à détecteur s'allume toute seule quand quelqu'un passe : personne n'appuie sur l'interrupteur. Une méthode magique est appelée par PHP lui-même quand l'événement se produit (affichage, lecture d'une propriété inconnue...).
Exemple simple
La valise sous vide
Pour ranger un objet dans un fichier ou une session, on le « met sous vide » (serialize) en une chaîne de texte, puis on le regonfle plus tard (unserialize). __sleep et __wakeup disent quoi garder et quoi refaire à l'arrivée.
Publicité
3Manipuler
La classe Fiche stocke des informations libres sur un client. Complétez ses méthodes magiques pour réaliser les consignes.
Pas à pas dans le lab ↗Cliquez sur Exécuter : PHP 8.3 démarre dans votre navigateur (environ 5 Mo à télécharger, une seule fois).
La page s'affichera ici.
Le navigateur demandera /index.php au serveur, qui exécutera le PHP et renverra du HTML.
Entre le navigateur et le serveuraucun échange pour l'instant
Consignes 0 / 3
« Ville : Fès » et « Fax : non renseigné »
echo $f affiche « Amina Benali (2 infos) »
« appeler() n'existe pas sur la fiche de Amina Benali »
4Pratiquer
Exercice 1 · __toString pour un produit
Ajoutez à la classe Produit(nom, prix) une méthode __toString qui renvoie « Tajine (180 DH) », puis affichez une liste de produits avec implode.
Voir le corrigé
<?phpclassProduit
{
publicfunction__construct(privatestring$nom, privatefloat$prix) {}
publicfunction__toString():string
{
return"{$this->nom} ({$this->prix} DH)";
}
}
$liste= [newProduit("Tajine", 180), newProduit("Savon", 30)];
echoimplode(", ", $liste); // implode convertit chaque objet en chaîne avec __toString
Exercice 2 · Clonage profond
Un objet Commande contient un objet Client. Après $copie = clone $commande, modifier $copie->client->ville modifie aussi l'original. Corrigez avec __clone.
Un objet Panier contient une connexion PDO (qu'on ne peut pas sérialiser) et un tableau de lignes. Écrivez __sleep et __wakeup pour ne garder que les lignes et reconnecter au réveil.
Voir le corrigé
<?phpclassPanier
{
private?PDO$pdo=null;
privatearray$lignes= [];
publicfunction__sleep():array
{
return ['lignes']; // propriétés à garder
}
publicfunction__wakeup():void
{
$this->pdo=newPDO('mysql:host=localhost;dbname=souk', 'root', '');
}
}
$texte=serialize($panier); // O:6:"Panier":1:{s:14:"Panierlignes";a:...}$panier2=unserialize($texte); // __wakeup est appelé