POO en PHP (3) - Constructeur et destructeur

Dans cette leçon vidéo, le formateur explique l'importance et l’utilisation des constructeurs (construct) et des destructeurs (destruct) en programmation orientée objet avec PHP. Après avoir rappelé une classe Voiture avec des attributs couleur et vitesse initialisés de façon statique, il montre pourquoi cette pratique est déconseillée et introduit le constructeur comme méthode magique appelée automatiquement lors de l’instanciation. Il détaille la syntaxe du constructeur (visibilité public, double underscore, nom __construct), les évolutions de PHP (ancienne forme avec le nom de la classe, désormais obsolète) et montre comment passer des paramètres avec ou sans valeurs par défaut pour initialiser les attributs. Le formateur exécute plusieurs variantes du code pour illustrer le passage d’arguments et l’utilisation de valeurs par défaut. Ensuite, il présente le destructeur, également méthode magique, déclenchée quand aucune référence à l’objet ne subsiste. Il crée un __destruct simple qui affiche un message et réinitialise la vitesse à zéro, expliquant son rôle de nettoyage (fermeture de fichiers, suppression de sessions, etc.). La vidéo se conclut en rappelant que chaque classe devrait idéalement posséder un constructeur pour l’initialisation et un destructeur pour le nettoyage, tout en insistant sur le caractère pédagogique de ces concepts.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de programmation orientée objet en PHP. Aujourd'hui nous allons voir le constructeur et le destructeur. Ici nous avons un extrait du code de la dernière fois. En effet nous avons créé une classe qui s'appelle Voiture et qui contient 2 attributs privés à savoir couleur et vitesse que nous avons initialisés respectivement aux valeurs rouge et 0. Ensuite nous avons déclaré 2 méthodes publiques à savoir la méthode accélérer qui permet d'agir sur la vitesse de la voiture et la méthode afficherCompteur qui permet d'afficher cette vitesse. Ensuite nous avons créé une instance de classe qui s'appelle berline et nous avons affiché la valeur du compteur. Donc quand on exécute déjà pour voir le résultat, on affiche 0 et c'est tout à fait normal parce que la vitesse a été initialisée à 0 et nous n'avons pas appelé la méthode accélérer qui va incrémenter celle-ci. Alors on affiche directement la valeur de la vitesse courante. Cependant, ce code n'est pas très optimisé parce que comme vous l'avez constaté, nous avons initialisé directement les attributs couleur et vitesse avant même de créer l'instance de classe, et ça c'est déconseillé en programmation orientée objet. En réalité, pour initialiser les attributs, il faut faire cette opération au moment de l'instanciation de la classe, c'est-à-dire au moment de la création de l'objet. Dans ce cas, c'est suite à la déclaration de cette instruction. Alors tout d'abord nous allons supprimer cette initialisation et on se contente simplement de déclarer les noms des attributs dont on aura besoin. Par contre ces valeurs seront initialisées automatiquement au moment de l'instanciation et pour faire cette opération on a besoin du constructeur. Le constructeur n'est rien d'autre qu'une méthode mais à l'inverse des méthodes que l'on a créées, c'est une méthode qui est appelée automatiquement suite à un événement Dans ce cas, l'événement qui va solliciter le constructeur, c'est l'instanciation. Créons d'abord le constructeur. Vous avez remarqué que j'ai déclaré avec la visibilité public. En réalité, dans la quasi-totalité des cas, la visibilité du constructeur est public, mais il y a bien des cas qui sont très rares où on a besoin d'un constructeur qui est privé. Ensuite, on déclare function parce que c'est une méthode, et vous avez remarqué que le nom du constructeur est un peu spécial. On le précède par 2 caractères soulignés ou bien underscore et ensuite le mot-clé construct. Il faut savoir qu'avant la version 7 du PHP, il était possible de déclarer le constructeur avec le même nom que la classe. Dans ce cas, je peux mettre Voiture avec un V majuscule à la place et ça devrait marcher. Mais avec PHP 7, c'est devenu obsolète et du coup ça sera probablement supprimé dans des prochaines versions. Alors la meilleure solution, c'est d'utiliser cette notation, à savoir 2 underscores et le mot-clé construct. En PHP, on appelle cette méthode une méthode magique. D'ailleurs, on va consacrer une leçon aux méthodes magiques qui sont disponibles en PHP et vous allez constater qu'elles commencent toutes par double sous-tiret comme ceci. Et le constructeur en est une. Le constructeur est appelé au moment de l'instanciation, c'est-à-dire à la ligne 16, le constructeur sera appelé automatiquement. On va faire un petit test pour voir. Maintenant quand on exécute le code on va voir que le message constructeur appelé est affiché parce que c'est l'opération de l'instanciation qui a appelé automatiquement le constructeur de la classe. Exécutons et nous avons bien le message constructeur appelé. Vous avez remarqué que la méthode afficher_compteur n'a rien retourné, c'est normal parce que la vitesse n'a pas été initialisée. Mais la question est à quoi ça sert? Comme j'ai dit tout à l'heure, le constructeur a pour rôle d'initialiser les attributs. C'est-à-dire qu'au lieu de faire ça d'une manière statique directement, il est préférable de le faire à l'intérieur du constructeur. Donc ce que nous allons faire, c'est initialiser les deux attributs couleur et vitesse. On mettra par exemple ici this couleur égale à rouge. Donc automatiquement, la couleur initiale c'est rouge. Et this.vitesse= 0, c'est-à-dire que l'instance de classe Berline est initialement à l'arrêt, sa vitesse courante est égale à 0. Exécutons maintenant le code pour voir, et ça nous affiche 0 parce que nous avons bien initialisé la vitesse que nous avons affichée ensuite. On peut toujours améliorer ce code, c'est-à-dire au lieu de fixer les valeurs d'initialisation des attributs couleur et vitesse, je vais plutôt les passer à travers les arguments du constructeur. Donc je mettrai ici les deux arguments couleur et vitesse, par exemple co et vi. Co c'est pour la couleur et vi c'est pour la vitesse. Et je mettrai ici vi. Et maintenant au moment de l'instanciation, il suffit de passer ces arguments parce que comme je l'ai dit, l'opération d'instanciation appelle automatiquement le constructeur. Alors il suffit de glisser les arguments dans l'ordre établi. Je mettrai ici par exemple rouge Et là c'est la valeur 0 pour la vitesse initiale. Et ça marche toujours de la même manière. On peut améliorer ça encore, on mettra par exemple ici la couleur par défaut c'est rouge et la vitesse initiale par défaut c'est 0. Dans ce cas-ci nous avons oublié de passer les arguments au constructeur ou bien si on veut pas le faire tout simplement, alors ce sont les valeurs par défaut qui sont prises. Dans ce cas quand j'exécute, J'ai toujours la valeur 0. Sinon je peux mettre ici par exemple blanc et 10. Alors j'ai systématiquement écrasé les valeurs par défaut en appliquant le blanc à la couleur et 10 à la vitesse. Et voilà, maintenant j'ai la valeur 10 pour la vitesse qui a été affichée. Donc ça c'est ce qui concerne le constructeur. Le destructeur quant à lui c'est aussi une méthode magique, c'est-à-dire qu'elle est appelée automatiquement suite à un événement. L'événement qui va appeler le destructeur, c'est quand il n'y aura plus aucune référence à l'objet ou bien à l'instance. Déclarons tout d'abord le destructeur. On mettra donc public destruct comme ceci et on affichera un message, par exemple destructeur appelé comme ceci. Je mettrai un br avant. Comme ça. On exécute maintenant pour voir le résultat. Nous avons la valeur 10 de la vitesse qui a été affichée et Destructor appelé ensuite, c'est-à-dire que ce message est affiché à la fin d'exécution du code. En réalité, le Destructor est une méthode magique qui est appelée quand il n'y a plus aucune référence à l'instance de classe, c'est-à-dire dans le reste du code quand je ne fais plus allusion à l'objet berline, c'est-à-dire je n'appelle aucun attribut ni méthode ni aucun membre qui appartient à cet objet. Alors c'est à ce moment-là que le destructeur sera appelé automatiquement. Alors puisque le destructeur viendra à la fin, alors on imagine qu'il a pour rôle de nettoyer l'objet, comme par exemple écraser les variables de session, ou bien la fermeture d'un fichier ouvert, etc. Dans notre cas, on va considérer que le destructeur, il va tout simplement garer la voiture, c'est-à-dire qu'il va appliquer la valeur 0 à la vitesse. On mettra donc This vitesse égale à zéro. Bien que ce code n'est pas très utile, bon parce que je pourrais pas afficher la vitesse après que le destructeur est appelé, sinon il serait pas appelé. Parce que comme je l'ai dit, le destructeur est appelé quand il n'y a plus aucune référence à l'instance de classe. Mais c'est juste un exemple, c'est-à-dire que le destructeur viendra pour faire le ménage en quelque sorte. Donc ce qu'il faut retenir, c'est qu'à chaque fois vous créez une classe, il faut toujours penser à la doter d'un constructeur et d'un destructeur. Le constructeur, il a pour rôle d'initialiser les attributs. Et le rôle du destructeur c'est en quelque sorte le nettoyage, comme par exemple la suppression des variables de session ou bien la fermeture d'un fichier ouvert ou encore la sauvegarde de données, etc. Ça sera tout pour cette séance, merci pour votre attention et à la vidéo prochaine.
More from Yamossoun

Algorithme de calcule de la racine carrée par dichotomie #dichotomy #squareroot #algorithm









