The video is a French instructional tutorial on PHP's magic methods, presented by Yamossoun Ayemou Bernard. It begins with a brief reminder that constructors (construct) and destructors (destruct) are magic methods that run automatically. The lecturer then introduces a custom class PHPString with private attributes `str` and `length`, showing how to initialize them in the constructor. Through live code examples, he demonstrates the limitations of accessing private properties from outside the class and then introduces each magic method one by one: - __get – automatically invoked when reading an inaccessible property; the method receives the property name, can perform checks, and returns the appropriate value, allowing controlled read access while preserving encapsulation. - __set – automatically invoked when writing to an inaccessible property; receives the property name and the new value, enabling controlled mutation of private attributes. - __toString – invoked when an object is treated as a string (e.g., echo); returns a string representation, here the original constructor value. - __isset – mirrors the built‑in `isset()` function; called when checking existence of a property, allowing the class to report true/false based on internal state. - __unset – mirrors the built‑in `unset()` function; called when attempting to delete a property, enabling the class to remove or nullify the internal attribute. For each method, the speaker writes the method signature, explains the double‑underscore naming convention, runs the code, and shows the resulting output, emphasizing that magic methods must be used carefully to avoid breaking encapsulation. He concludes by encouraging viewers to consult the official PHP documentation (php.net) for the full list of magic methods. The tutorial’s purpose is to teach PHP developers how to leverage magic methods to manage private data, customize object behavior, and maintain encapsulation while providing convenient syntactic shortcuts.
Chapters
Bonjour à tous et bienvenue dans cette nouvelle leçon de programmation orientée objet en PHP. Aujourd'hui nous allons voir les méthodes magiques. Une méthode magique est une méthode qui s'exécute automatiquement suite à un événement particulier, c'est-à-dire que ce n'est pas à nous de les appeler manuellement au sein du code. Si vous vous rappelez de la leçon où nous avons vu le constructeur et le destructeur, j'ai mentionné que ces deux méthodes sont des méthodes magiques. Le constructeur est appelé automatiquement suite à l'instanciation de la classe et le destructeur est appelé automatiquement quand il n'y a plus aucune référence à l'instance de classe dans le reste du code. Autrement dit, ces deux méthodes ce n'est pas nous qui les invoquons manuellement au sein du code, mais elles sont appelées systématiquement si l'évènement approprié est détecté. Aujourd'hui encore nous allons voir d'autres méthodes magiques qui sont aussi pratiques. Donc on va imaginer que l'on va créer une classe qui va traiter les chaînes de caractères en PHP dont le code ressemblera à ceci: J'ai appelé ma classe PHPString parce que le mot-clé String est réservé depuis la version 7 du PHP, alors on n'a plus le droit de s'en servir pour créer nos propres entités. Ensuite, je vais déclarer 2 attributs: l'attribut str et l'attribut length. On imagine que l'attribut str recevra la chaîne de caractères à traiter et et l'attribut length contiendra la longueur de cette chaîne. Ensuite, nous allons créer le constructeur qui va initialiser ces deux attributs. On va passer en guise d'argument au constructeur la valeur de la chaîne de caractères spécifiée par l'utilisateur. Alors comme ça, nous avons affecté cette valeur à str. Et maintenant nous allons calculer la longueur de la chaîne et on va stocker le résultat dans l'attribut length. On utilisera la fonction strlen du PHP. Alors comme ça nous avons initialisé nos 2 attributs. Ensuite nous allons instancier notre classe. Et on passe comme argument la chaîne de caractères poo. Et ensuite on va essayer d'afficher la valeur de la propriété length à l'extérieur de la classe. Bien entendu ça devrait pas marcher parce que cet attribut est privé. Exécutons. Ça nous affiche bien la fameuse erreur comme quoi cette propriété n'est pas accessible depuis l'extérieur de la classe. C'est normal parce que c'est privé. Maintenant, si vous tenez à accéder à cette propriété en lecture à l'extérieur de la classe, la seule solution que l'on peut envisager, c'est de la rendre publique. Cependant, il existe une autre technique, c'est l'utilisation d'une méthode magique du nom du getter, que l'on va déclarer de la manière suivante. Voilà, c'est une méthode qui devrait être publique, bon, parce que l'on aura besoin depuis l'extérieur de la classe. Et c'est préfixé par double sous-tiré parce que généralement les méthodes magiques sont toujours préfixées par double sous-tiré comme le constructeur et le destructeur. Le getter accepte un seul paramètre. On mettra par exemple ici at. En fait, le getter est une méthode magique qui va s'exécuter automatiquement si on essaie d'accéder à un attribut inaccessible. Dans ce cas, le getter s'exécute automatiquement en acceptant comme argument le nom de l'attribut qui a causé l'erreur. Dans ce cas, $at sera remplacé par l'un. Bon, pour faire un test, on va écrire ici un message, par exemple, echo attribut@ est inaccessible. On mettra carrément@ en gras. C'est-à-dire, au moment de l'exécution de la ligne 14, le getter sera exécuté et affichera ce message. Voilà, ça nous affiche l'attribut length est inaccessible, c'est-à-dire qu'il a automatiquement détecté l'attribut qui a causé l'erreur. Et puisque c'est comme ça, alors on va profiter de cette méthode afin de réellement retourner la valeur de length parce que le getter est déclaré à l'intérieur de la classe, donc il peut accéder à l'attribut privé length. On mettra donc là quelque chose du genre return this Bien sûr, le@ avec un dollar parce que c'est un argument et non pas un attribut, mais il sera remplacé par le nom de l'attribut sans le dollar. Ça veut dire juste par name. Alors si on exécute maintenant pour voir le résultat, on voit qu'on n'a plus d'erreur. En fait, même si on tente d'afficher un attribut privé à l'extérieur de la classe, le getter anticipe l'erreur et fait le traitement à notre place. Bien entendu, ce genre de traitement, il faut le contrôler. Ça veut dire qu'il faut pas permettre à l'utilisateur d'afficher n'importe quel attribut. Donc il faut mettre des conditions particulières afin de contrôler ceci, sinon le principe d'encapsulation sera systématiquement inutile. Donc là, c'est ce qui concerne le getter. Une autre méthode magique, c'est le setter. Si le getter s'exécute automatiquement si on tente d'accéder en lecture à un attribut inaccessible, le setter quant à lui s'exécute quand on essaie de modifier la valeur d'un attribut inaccessible. On le déclare de cette manière. Et le setter accepte 2 arguments: le nom de l'attribut et la valeur qu'on essaie de lui assigner. Par exemple, on va afficher le message suivant: echo, vous essayez d'affecter val à@. Donc maintenant, si depuis l'extérieur de la classe j'essaie de modifier mon attribut, ce qui n'est pas permis automatiquement parce que c'est privé, Dans ce cas, le setter anticipera l'erreur et s'exécutera automatiquement. On mettra par exemple là la chaîne str égale à salut. On enlève carrément cette ligne. Alors exécutons pour voir le résultat. Donc ça m'affiche vous essayez d'affecter salut à str. Alors le setter s'est exécuté automatiquement. Donc maintenant on va utiliser le même principe que pour le getter, ça veut dire on va essayer d'affecter réellement la valeur val à l'attribut qui a causé l'erreur. On mettra donc là s_at égale à val. Jusqu'ici nous avons écrasé la valeur poo et on a remplacé par salut. Maintenant pour en avoir le cœur net on va essayer d'afficher la valeur de cet attribut. Donc la ligne 17 va appeler automatiquement le setter puisqu'on essaie de modifier la valeur d'un attribut privé et la ligne 18 va appeler automatiquement le getter puisqu'on essaie d'accéder en lecture à un attribut privé. Exécutons et ça nous affiche salut. Ça veut dire qu'on a réellement modifié la valeur de l'attribut privé même depuis l'extérieur de la classe parce que le setter a fait cette opération à notre place à l'intérieur de la classe. Maintenant essayons de faire ceci, on mettra echo str tout court. N'oubliez pas que str c'est l'objet, alors on essaie d'afficher l'objet en tant que chaîne de caractères. Regardons ce que PHP va nous dire. Alors ça nous dit qu'il peut pas convertir l'objet en une chaîne de caractères et c'est tout à fait naturel. Alors imaginez avec moi que si j'affiche l'objet, à la place je voudrais afficher la valeur que j'ai passée au constructeur qui est dans ce cas poo. Alors on va encore faire appel à une méthode magique qui s'appelle toString. Comme ceci. Bon, ça n'accepte aucun argument, mais ça va nous retourner une chaîne dans notre choix. Par exemple, little toString appelé. Bon, exécutons déjà pour voir. Donc ça m'affiche toString appelé, mais c'est pas ce que je veux afficher. Donc moi, je veux plutôt afficher la valeur que j'ai passée au constructeur. Alors je mettrai directement little s str. On exécute et ça m'affiche PO. Donc toString, c'est une méthode qui est très appréciée par les développeurs parce qu'il permet de résoudre plein de problèmes, notamment celui-ci. Maintenant, imaginez que depuis l'extérieur de la classe, je veux faire le traitement suivant. Par exemple, if isSet C'est-à-dire que je vais vérifier est-ce que l'attribut str existe ou n'existe pas. N'oubliez pas que j'ai fait ce traitement à l'extérieur de la classe. Exécutons pour voir ce que ça donne. Ça m'affiche n'existe pas. Moi je sais bien que ça existe parce que c'est bien initialisé à l'intérieur de la classe, mais le problème c'est que c'est à l'intérieur de la classe que c'est fait. Depuis l'extérieur ce n'est pas visible. Et pour pallier ce problème, on va encore faire appel à une méthode magique qui s'appelle isset. Ça veut dire qu'il y a le même nom que la fonction isset du PHP et qui accepte un argument. Ça veut dire toujours le nom de l'attribut qui a causé l'ennui. Et là, comme vous l'avez deviné, je vais exécuter la fonction isset à l'intérieur de la classe en lui passant comme argument l'attribut souhaité. Et je vais récupérer sa valeur. Donc je mettrai little isset this->at. Dans ce cas, je vais récupérer la valeur de retour qui soit true soit false. Et selon elle, je vais afficher soit existe ou bien n'existe pas. Maintenant, j'imagine que ça va afficher existe. Et voilà, ça existe bel et bien. De la même manière, imaginez que je veux supprimer l'attribut str. Je mettrai par exemple un set str. En faisant ceci, j'ai écrasé l'attribut str puis j'ai vérifié son existence. Mais n'oubliez pas que j'ai supprimé cet attribut à l'extérieur de la classe. Regardons comment ça va se comporter. Bon, ça m'affiche une erreur, c'est normal parce que je peux pas accéder à cet attribut depuis l'extérieur de la classe. Et là encore, on va faire appel à une autre méthode magique qui a le même nom que la fonction unset. Et qui accepte aussi en guise d'argument le nom de l'attribut. En suivant le même principe, je vais faire le traitement à l'intérieur de la classe, donc je mettrai unset. Dans ce cas, j'ai écrasé cet attribut à l'intérieur de la classe, ce qui est permis, mais d'une manière automatique, c'est-à-dire suite à l'appel de la fonction unset depuis l'extérieur de la classe. Désormais, on imagine que la méthode isset va nous afficher n'existe pas. En exécutant. Et voilà, ça donne n'existe pas. Ça veut dire que j'ai bel et bien pu supprimer l'attribut depuis l'extérieur de la classe malgré qu'il soit privé. Il existe d'autres méthodes magiques. Bon, d'ailleurs, je vous renvoie toujours sur le site officiel du PHP, www.php.net, pour en découvrir davantage. On se contente de ça pour cette séance. Merci pour votre attention et à la vidéo prochaine.