Exploitez les méthodes communes à tous les objets
L'usage du mot clé class
vous donne accès, dès le départ, à un jeu de méthodes sans que vous n'ayez rien à écrire. Ces méthodes sont particulières, accrochez-vous pour la phrase suivante ! Vous n'avez pas besoin de les écrire pour les utiliser, et si vous les écrivez vous ne les appellerez probablement jamais. Autrement dit, ces méthodes sont prédéfinies par PHP, et sont appelées automatiquement dans la plupart des cas.
Ce jeu de méthodes est un moyen d'intervenir dans le processus de création, modification et suppression des objets de PHP, afin d'y ajouter des comportements personnalisés.
Elles sont reconnaissables parce qu'elles sont préfixées par deux underscores. Il en existe plusieurs, que vous pouvez regarder dans la documentation PHP. Ici, nous nous intéressons tout d'abord à deux d’entre elles : __construct
et__destruct
.
La première est une méthode appelée automatiquement par PHP lorsque vous créez une instance à l'aide du mot clénew
. On appelle la méthode __construct
un constructeur. C'est une mécanique que l'on retrouve dans tous les langages objets. Dans certains, la méthode porte le nom de la classe. La majeure partie du temps, le constructeur nous sert à initialiser des données de départ pour notre objet.
La seconde est un destructeur. La méthode est appelée automatiquement lorsque l’objet est supprimé de la mémoire, ce qui est fait à chaque fois que le script se termine. Il existe deux autres moyens de le déclencher manuellement : en supprimant l’objet avec unset
ou en remplaçant le contenu de la variable qui y fait référence. Pour faire simple, dès que PHP détecte que plus rien ne fait référence à un objet en mémoire, il le détruit, et donc déclenche __destruct
.
Reprenons notre pont avec deux mutateurs pour définir les valeurs des longueur et largeur :
<?php
declare(strict_types=1);
class Pont
{
private float $longueur;
private float $largeur;
public function setLongueur(float $longueur): void
{
$this->longueur = $longueur;
}
public function setLargeur(float $largeur): void
{
$this->largeur = $largeur;
}
}
$towerBridge = new Pont;
$towerBridge->setLongueur(286.0);
$towerBridge->setLargeur(62.2);
Et remplaçons à présent les mutateurs par l'usage du constructeur.
<?php
declare(strict_types=1);
class Pont
{
private float $longueur;
private float $largeur;
public function __construct(float $longueur, float $largeur)
{
$this->longueur = $longueur;
$this->largeur = $largeur;
}
}
$towerBridge = new Pont(286.0, 62.0);
Nous avons assigné les valeurs de longueur et de largeur dès la création de l'instance de la classe. Pour donner les arguments au constructeur, nous avons ajouté une paire de parenthèses derrière le nom de la classe, comme s'il s'agissait d'une méthode, à la ligne 17. Ce qui est le cas en quelque sorte, puisque nous faisons appel à la méthode __construct
!
Je vous ai montré ce que vous êtes susceptible de rencontrer le plus souvent. Mais depuis PHP8, vous pouvez aussi le rencontrer sous sa forme courte. En précisant la visibilité directement au niveau des arguments du constructeur, vous pouvez ne pas déclarer les propriétés et leur assignation. Ce sera fait automatiquement par PHP :
<?php
declare(strict_types=1);
class Pont
{
public function __construct(private float $longueur, private float $largeur)
{
}
}
$towerBridge = new Pont(286.0, 62.0);
var_dump($towerBridge);
Tirez profit des appels automatisés avec PHP
Au risque de me répéter, ce jeu de méthodes est un moyen d'intervenir dans le processus de création, modification et suppression (entre autres) des objets de PHP, afin d'y ajouter des comportements personnalisés.
L'existence de ces méthodes est surveillée par PHP, et dès qu'il les détecte dans votre classe, il les utilise aux différents moments de leur vie. PHP y fait appel et les rend accessibles dès que vous les écrivez. Si vous essayez de les appeler sans les déclarer, vous obtenez une erreur :
<?php
class Pont
{
}
$towerBridge = new Pont;
$towerBridge->__construct(12.2, 43.1);
C’est parce que PHP les appelle dès que possible sans vous le demander que vous rencontrerez souvent le terme méthode magique. Ne pas les connaître donne une impression de magie, de boîte noire. Démystifions ces méthodes ensemble dans les screencast ci-dessous. Commençons par __clone
et __toString
:
Puis, découvrons __invoke
, __sleep
et __wakeup
:
Nous finirons notre tour des méthodes magiques avec __serialize
, __unserialize
, __get
, __set
, __isset
, __unset
et __call
:
Et si vous rajoutiez un peu de magie à votre code ? ;)
C’est le moment de vous exercer !
Exercez-vous
Nous avons vu comment créer une classe, définir la visibilité des propriétés et des méthodes, et définir des constantes, ainsi que la staticité, et maintenant que vous avez les méthodes magiques dans votre arsenal ! Il est temps de vous exercer !
Reprenons notre cas fil rouge, MatchMaker, je vais vous donner un extrait de code.
Votre mission, si vous l’acceptez, est d’utiliser un constructeur, un accesseur et un mutateur dans la classe Player
afin de simplifier l’instanciation des joueurs dans le code.
Vous trouverez le code de l’exercice sur la branche P1C7, et la correction sur la branche P1C7-correction. :)
En résumé
Il existe des méthodes dites magiques, qui sont appelées automatiquement par PHP. Elles commencent par
__
.
__construct
est la méthode appelée lors de la création d’un objet ;__destruct
lors de sa suppression de la mémoire.Il existe de nombreuses autres méthodes magiques disponibles sur la documentation PHP.
Jusqu'ici nous n'avons fait que manipuler une seule sorte de pont. Comment feriez-vous pour distinguer un autre type de pont, avec une seconde classe ? Et comment feriez-vous pour en distinguer un troisième ?
Ils auront des choses en commun, non ? Et ce serait dommage d’avoir à dupliquer ces morceaux de code... Nous allons voir comment résoudre cette situation dans la prochaine partie ! Mais avant, voyons si vous avez bien mémorisé les bases à travers un quiz. Dès que vous êtes prêt, rejoignez-moi ! :)