Easy-Micro

LANGAGE Intro POO PHP
Méthodes magiques

Introduction à la programmation orientée objet en PHP

Les méthodes magiques sont des méthodes qui vont être appelées automatiquement suive à un évènement déclencheur propre à chacune d'entre elles. Ces méthodes magiques sont reconnaissables en PHP au fait que leur nom commence par un double underscore __. En voici la liste (PHP7) :

  • __construct()
  • __destruct()
  • __call()
  • __callStatic()
  • __get()
  • __set()
  • __isset()
  • __unset()
  • __toString()
  • __clone()
  • __sleep()
  • __wakeup()
  • __invoke()
  • __set_state()
  • __debugInfo()

Les méthodes magiques __construct() et __destruct()

Nous connaissons déjà les deux méthodes magiques __construct() et __destruct(). La méthode __construct() va être appelée dès qu'on va instancier une classe possédant un constructeur. Cette méthode est très utile pour initialiser les valeurs dont un objet a besoin dès sa création et avant toute utilisation de celui-ci.

La méthode magique __destruct() est la méthode "contraire" de la fonction constructeur et va être appelée dès qu'il n’y a plus de référence sur un objet donné ou dès qu'un objet n'existe plus dans le contexte d'une certaine application. Le destructeur va nous servir à "nettoyer" le code en détruisant un objet une fois qu'on a fini de l'utiliser.

Les méthodes magiques __call() et __callStatic()

La méthode magique __call() va être appelée dès qu'on essaie d'utiliser une méthode qui n’existe pas (ou qui est inaccessible) à partir d'un objet. On va passer deux arguments à cette méthode : le nom de la méthode qu'on essaie d’exécuter ainsi que les arguments relatifs à celle-ci (si elle en a). Ces arguments vont être convertis en un tableau.

La méthode magique __callStatic() s'exécute dès qu'on essaie d'utiliser une méthode qui n'existe pas (ou qui est inaccessible) dans un contexte statique cette fois-ci. Cette méthode accepte les mêmes arguments que __call().

Le fichier classes/utilisateur.class.php
<?php
abstract class Utilisateur {
     protected $user_name;
     protected $user_region;
     protected $prix_abo;
     protected $user_pass;
     public const ABONNEMENT = 15;
        
     public function __destruct() {
         //Du code à exécuter
     }
        
     abstract public function setPrixAbo();
        
     public function getNom() {
         echo $this->user_name;
     }
     public function getPrixAbo() {
         echo $this->prix_abo;
     }

     // Si une méthode appelée depuis un contexte objet est inaccessible,
     // __call() va être appelée automatiquement
     public function __call($methode, $arg){
         echo 'Méthode ' .$methode. ' inaccessible depuis un contexte objet.
         <br>Arguments passés : ' .implode(', ', $arg). '<br>';
     }

     // Si une méthode appelée depuis un contexte statique est inaccessible,
     // __callStatic() va être appelée automatiquement
     public static function __callStatic($methode, $arg){
         echo 'Méthode ' .$methode. ' inaccessible depuis un contexte statique.
         <br>Arguments passés : ' .implode(', ', $arg). '<br>';
     }
}
Nos deux méthodes __call() et __callStatic() vont ici simplement renvoyer un texte avec le nom de la méthode inaccessible et les arguments passés.

Pour tester le fonctionnement de ces deux méthodes, __call() et __callStatic(), il suffit d'essayer d'exécuter des méthodes qui n'existent pas dans notre script principal :

Le fichier index.php
<!DOCTYPE html>
<html  lang="fr">
<head>
<title>POO PHP</title>
<meta charset="utf-8">
<link rel="stylesheet" href="css/mesStyles.css">
</head>
<body>
<h1>Inscription</h1>
<?php
     require 'classes/utilisateur.class.php';
     require 'classes/admin.class.php';
     require 'classes/abonne.class.php';

     $Admin1 = new Admin('Pierre', 'abcdef', 'Sud');
     $Admin2 = new Admin('Mathilde', 123456, 'Nord');
     $Abonne1 = new Abonne('Edouard', 123456, 'Est');
        
     $Admin1 -> test1('argument1');
     echo '<br>';
     Admin::test2('argument2', 'argument3');
?>
</body>
</html>
L'opérateur de résolution de portée utilisé ci dessus (::) permet d'accéder à une méthode parent

-> Voir cet exemple Easy-Micro


Les méthodes magiques __get(), __set(), __isset() et __unset()

La méthode magique __get() va s'exécuter si on tente d'accéder à une propriété inaccessible (ou qui n'existe pas) dans une classe. La méthode magique __set() s'exécute dès qu'on tente de créer ou de mettre à jour une propriété inaccessible (ou qui n'existe pas) dans une classe. Elles vont prendre en argument le nom de la propriété à laquelle on souhaite accéder, créer ou mettre à jour.

Le fichier classes/utilisateur.class.php
<?php
abstract class Utilisateur {

// ...

   public function __get($prop){
      echo 'Propriété ' .$prop. ' inaccessible.<br>';
   }

   public function __set($prop, $valeur){
      echo 'Impossible de mettre à jour la valeur de ' .$prop. ' avec "'.$valeur. '" (propriété inaccessible)';
   }
}
Le fichier index.php
<!DOCTYPE html>

<!-- ... -->

   $Admin1 -> prixAbo; //Inaccessible depuis un objet car protected
         echo '<br>';
         $Admin1 -> prixAbo = 20;
?>
</body>
</html>

De manière similaire, la méthode magique va s'exécuter lorsque les fonctions isset(), empty() ou __unset() sont appelées sur des propriétés inaccessibles.

-> Voir cet exemple Easy-Micro

La méthode magique __toString()

La méthode magique __toString() va être appelée dès que l'on va traiter un objet comme une chaine de caractères (par exemple lorsqu'on tente d'echo un objet). ⚠ Attention, cette méthode doit obligatoirement retourner une chaine ou une erreur sera levée par le PHP.

Le fichier classes/utilisateur.class.php
<?php
abstract class Utilisateur {

// ...

   public function __toString(){
         return 'Nom d\'utilisateur : ' .$this -> user_name. '<br>
         Prix de l\'abonnement : ' .$this -> prix_abo. '<br><br>';
   }
}
Le fichier index.php
<!DOCTYPE html>

<!-- ... -->

   $Admin1 -> setPrixAbo();
   $Admin2 -> setPrixAbo();
   echo $Admin1;
   echo $admin2;
?>
</body>
</html>

-> Voir cet exemple Easy-Micro

La méthode magique __clone()

La méthode magique __clone() s'exécute dès que l’on crée un clone d'un objet pour le nouvel objet créé. Cette méthode va nous permettre notamment de modifier les propriétés qui doivent l'être après avoir créé un clone pour le clone en question.

La méthode magique __invoke()

La méthode magique __invoke() va être appelée dès qu'on tente d'appeler un objet comme une fonction.

Le fichier classes/utilisateur.class.php
<?php
abstract class Utilisateur {

// ...

   public function __invoke($arg) {
         echo 'Un objet a été utilisé comme une fonction<br>
               Argument passé : ' .$arg. '<br><br>';
        }
}
Le fichier index.php
<!DOCTYPE html>

<!-- ... -->

   $Admin1(1234);

?>
</body>
</html>

-> Voir cet exemple Easy-Micro

Les méthodes magiques __sleep(), __wakeup(), __set_state() et debugInfo()

Nous n'étudierons pas ici les méthodes magiques __sleep(), __wakeup(), __set_state() et debugInfo() simplement car elles répondent à des besoins très précis et ne vont avoir d'intérêt que dans un contexte et dans un environnement spécifique.

« Prev - Intro POO PHP - Next »


< Page précédente INTRO POO PHP Page suivante >