Programmation orientée objet en PHP

Auteur: Mohamed CHINY Durée necessaire pour le cours de Programmation orientée objet en PHP Niveau recommandé pour le cours de Programmation orientée objet en PHP Supports vidéo non disponibles pour ce cours Exercices de renforcement disponibles pour ce cours Quiz non disponibles pour ce cours

Page 6: Méthodes magiques

Toutes les pages

Les méthodes magiques en PHP

Les méthodes magiques sont des méthodes prédéfinies et toutes préfixées par double sous-tirets (__) dans une classe PHP. Elle sont appelées automatiquement suite à un événement spécial qui peut survenir lors de l’exécution.

Il est recommandé de ne jamais préfixer les méthodes personnalisée par double sous-tirets. Cette notation est réservée aux méthodes magiques.

Nous avons déjà vu deux de ces méthodes. Il s'agit de __construct() et __destruct(). En effet, le constructeur et le destructeur sont tous les deux des méthodes magiques qui s’exécutent automatiquement suite à un événement. Le constructeur est exécuté suite à l'instanciation et le destructeur quand il n'y a plus de référence à la classe dans le reste du code.

En fait, PHP dispose de plusieurs méthodes magiques. Dans ce qui suit, nous allons essayer de voir les plus fréquentes.

Méthode __get()

Connue par le nom de getter, __get($att) est une méthode qui s’exécute automatiquement quand on appelle un attribut inexistant ou inaccessible.

Par exemple, si on veut accéder à la valeur d'un attribut privé de l'extérieur de la classe, le getter anticipe l'erreur et s’exécute automatiquement. Dans ce cas l'argument $att sera remplacé par le nom de l'attribut sollicité.

Exemple:
<?php
   class Maclasse{
      private $attribut="Bonjour";
      public function __get($att){
         return "L'attribut <b>$att</b> est inaccessible.";
      }
   }
   $objet=new Maclasse();
   echo $objet->attribut;
?>
Ce qui donne:
L'attribut attribut est inaccessible.
Le fait de tenter d'accéder à l'attribut privé $attribut en lecture depuis l'extérieur de la classe appelle automatiquement la méthode __get($att) qui reçoit comme argument le nom de l'attribut qui a causé son appel (dans ce cas attribut dépourvue de son dollar). Le résultat de la méthode __get($att) est retourné puis affiché à l'aide de la structure echo.

En général le getter est utilisé pour réellement accéder aux attributs privés depuis l'extérieur de la classe (d'une manière contrôlée, pour ne pas rompre le principe d'encapsulation).

Exemple:
<?php

   class Maclasse{
      private $attribut="Bonjour";
      public function __get($att){
         return $this->$att;
      }
   }
   $objet=new Maclasse();
   echo $objet->attribut;
?>
Donne:
Bonjour

Méthode __set()

La méthode __set($att,$val) connue sous le nom de setter est appelée automatiquement quand on essaie de modifier un attribut inexistant ou inaccessible. Dans ce cas, l'argument $att reçoit le nom de l'attribut et $val la valeur qu'on tente de lui affecter.

Si on souhaite modifier la valeur d'un attribut privé de l'extérieur de la classe on peut procéder ainsi:
<?php
   class Maclasse{
      private $attribut="Bonjour";
      public function __get($att){
         return $this->$att;
      }
      public function __set($att,$val){
         $this->$att=$val;
      }
   }
   $objet=new Maclasse();
   $objet->attribut="Bonsoir";
   echo $objet->attribut;
?>
Ce qui donne:
Bonsoir
La ligne $objet->attribut="Bonsoir" tente de modifier la valeur de l'attribut privé $attribut de l'extérieur de la classe, ce qui n'est pas permis. Cependant, le setter s’exécute automatiquement et affecte la valeur voulue à l'attribut en question. Le getter intervient avec l’exécution de la ligne echo $objet->attribut qui essaie d'accéder en lecture à la valeur de l'attribut privé de l'extérieur de la classe.

Méthode __isset()

La méthode magique __isset($att) est appelé automatiquement quand on exécute la fonction isset() en lui passant en paramètre un attribut inexistant ou inaccessible. Dans la pratique, on fait en sorte que cette méthode retourne le résultat escompté par la fonction isset(), à savoir true si l'attribut existe et false si l'attribut n'existe pas.

Exemple:
<?php

   class Maclasse{
      private $attribut="Bonjour";
      public function __isset($att){
         return isset($this->$att);
      }
   }
   $objet=new Maclasse();
   if(isset($objet->attribut))
      echo "L'attribut existe";
   else
      echo "L'attribut n'existe pas";
?>
Ce qui donne:
L'attribut existe

Méthode __unset()

La méthode magique __unset($att) est appelé automatiquement quand on essaie de supprimer un attribut inexistant ou inaccessible à l'aide de la fonction unset(). Dans la pratique, on fait en sorte que cette méthode supprime l'attribut souhaité suite à l’invocation de la fonction unset() en lui passant comme paramètre l'attribut en question.

Exemple:
<?php
   class Maclasse{
      private $attribut="Bonjour";
      public function __unset($att){
         unset($this->$att);
      }
   }
   $objet=new Maclasse();
   unset($objet->attribut);
?>
Ce code supprime l'attribut privé $attribut.

Méthode __toString()

La méthode magique __toString() est appelé automatiquement quand on tente de traiter un objet en tant que chaîne de caractères (à l'aide de la structure echo par exemple). Dans ce cas, cette méthode retourne la chaîne de caractères de notre choix.

Exemple:
<?php
   class Maclasse{
      private $str;
      public function __construct($param){
         $this->str=$param;
      }
      public function __toString(){
         return $this->str;
      }
   }
   $objet=new Maclasse("Bonjour");
   echo $objet;
Ce code donne:
Bonjour