PHP orienté objet, les méthodes magiques (3)
Dans ce nouveau chapitre, nous allons voir les méthodes magiques
Tout d’abord, définissons ensemble ce qu’est une méthode magique
Une méthode magique est une méthode appelé lors d’un événement si elle est bien entendu présente dans votre classe. Une méthode magique sert principalement à intercepter des événements et effectuer des traitements ou encore des affectations lorsque l’événement se produit.
La méthode magique __construct() est une méthode magique dès plus connues. Elle est appelé lors de l’événement d’instance, c’est à dire qu’à chaque instance de votre classe, la méthode magique __construct() est appelé. On sert généralement du constructeur pour affecter des valeurs à des attributs ou encore pour établir une connexion à une base de données…
Vous savez maintenant ce qu’est une méthode magique, il faut retenir qu’une méthode magique sert à intercepter des événement comme l’instance de la classe par exemple pour y effectuer des traitements. Il existe beaucoup de méthodes magiques, nous en verrons quelques-unes dans les prochains chapitres.
Mettre un constructeur dans une classe
Rien de plus simple ! Voici la syntaxe:
1 2 3 4 5 6 7 8 9 | <?php class myClass { public function __construct() { echo 'hello world'; } } ?> |
Si vous faites une instance de la classe ‘myClass‘, le constructeur sera appelé et donc vous verrez ‘hello world‘ sur votre écran. Si c’est bien le cas, on se rend bien compte que le constructeur est appelé des l’instance et que tout fonctionne bien
.
Et si nous voulions affecter une valeur à un attribut….
Voici ce que nous devrions faire:
1 2 3 4 5 6 7 8 9 10 11 | <?php class myClass { public $attr; public function __construct() { $this->attr = 'hello world'; } } ?> |
Dès l’instance de la classe ‘myClass‘, l’attribut $attr vaudra donc ‘hello world’. Simple n’est ce pas ?!
Dans le cadre d’une connexion à une base de données, nous pourrions écrire cette classe:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php class connexion { private $_host = 'localhost'; private $_user = 'root'; private $_password = ''; private $_db = 'dbname'; public function __construct() { mysql_connect($this->_host, $this->_user, $this->_password); mysql_select_db($this->_db); } } ?> |
Des l’instance de la classe ‘connexion‘, une connexion au serveur mysql sera établie.
Le constructeur d’une classe doit toujours être de visibilité public, sauf dans certains cas. Dans le cadre de l’utilisation d’un design pattern comme le singleton, le constructeur serait de visibilité private. Nous verrons les design pattern dans un chapitre qui leurs sera dédiés
.
Les méthode magiques __set() et __get()
Voici deux nouvelles méthodes magiques très connues, __set() et __get(). Si vous avez bien suivi jusque la, vous savez qu’une méthode magique est appelé lors d’un événement. La question qui devrait donc vous venir à l’esprit est: « Lors de quel événement __set() et __get() sont appelés ?! » Si vous vous êtes naturellement posé cette question, alors vous avez tout compris aux méthodes magiques
.
La méthode __set()
La méthode magique __set() est appelée lors de l’affectation d’une valeur à un attribut qui n’existe pas ou auquel nous n’avons pas accès. Quand je parle d’accès, je parle bien entendu de la visibilité de l’attribut.
Un exemple concret, prenons une classe de ce type:
1 2 3 4 5 6 | <?php class myClass { private $_attr; } ?> |
Cette classe contient seulement un attribut de visibilité private. Nous n’avons donc pas accès à cet attribut. Pour le vérifier, faisons une instance de cette classe et essayons de modifier la valeur de l’attribut $_attr à la visibilité private:
1 2 3 4 5 6 | <?php $instance = new myClass(); $instance->_attr = 'coucou'; print_r($instance); ?> |
Un joli message d’erreur devrait apparaitre lors de la tentative d’affectation. Essayons donc d’implémenter la méthode magique __set() pour intercepter cet événement !
Notre classe ressemble maintenant à ça:
1 2 3 4 5 6 7 8 9 10 11 | <?php class myClass { private $_attr; public function __set($name, $value) { echo 'il n\'est pas possible d\'affecter '.$value.' à '.$name.' car sa visibilité est private.'; } } ?> |
Ressayez donc l’affectation :
1 2 3 4 5 6 | <?php $instance = new myClass(); $instance->_attr = 'coucou'; print_r($instance); ?> |
On voit bien que l’événement est intercepté grâce à la méthode magique
.
Si tout à bien fonctionné, vous devriez voir sur vitre écran:
il n'est pas possible d'affecter la valeur coucou à attr car sa visibilité est private.
La méthode __get()
La méthode magique __get() est presque similaire à __set(), elle est exécuté lorsque l’on essaye d’accéder à un attribut qui n’existe pas ou dont la visibilité ne le permet pas.
Reprenons la classe myClass ci-dessus:
1 2 3 4 5 6 | <?php class myClass { private $_attr; } ?> |
Maintenant, on lui implémente la méthode magique __get():
1 2 3 4 5 6 7 8 9 10 11 | <?php class myClass { private $_attr; public function __get($name) { echo 'l\'attribut ' . $name . ' n\'est pas accessible !'; } } ?> |
On essaye maintenant d’accéder à l’attribut de visibilité private:
1 2 3 4 | <?php $instance = new myClass(); echo $instance->_attr; ?> |
Si tout fonctionne bien, le message à l’écran est :
l'attribut _attr n'est pas accessible !
Et voila pour les méthodes magiques __construct(), __set() et __get().
Une petite synthèse
- La méthode magique __construct() est appelée des l’instance de notre classe. Cette méthode magique est principalement utilisée pour affecter des valeurs à des attributs de notre classe.
- La méthode magique __set() est appelée lorsque l’on essaye d’affecter une valeur à un attribut qui n’existe pas ou qui n’est pas accessible de par sa visibilité.
- La méthode magique __get() est appelée lorsque l’on essaye d’accéder à un attribut qui n’existe pas ou qui n’est pas accessible de par sa visibilité.
C’est la fin de ce chapitre, dans le prochain, nous allons voir les constantes de classe, l’opérateur de résolution de porté ainsi que les méthodes statiques
.
Laissez un commentaire