• 10 hours
  • Medium

Free online content available in this course.

course.header.alt.is_video

Paperback available in this course

course.header.alt.is_certifying

Got it!

Last updated on 8/21/23

Exploitez les méthodes communes aux objets

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);

Tester ce code

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);

Tester ce code

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);

Tester ce code

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);

Tester ce code

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 ! :)

Example of certificate of achievement
Example of certificate of achievement