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().
<?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>';
}
}
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>
-> 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.
<?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)';
}
}
<!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