Apprendre à coder sur pierre-giraud.com

DES COURS COMPLETS ET GRATUITS POUR TOUS

SOMMAIRE

Introduction

  1. Présentation du cours
  2. Introduction au PHP
  3. Mettre en place un env. de travail

Les bases en PHP

  1. Syntaxe de base du PHP
  2. Premières instructions PHP
  3. Introduction aux variables PHP
  4. Types de valeurs et concaténation
  5. Opérations sur les variables
  6. Conditions et opérateurs de comparaison
  7. Les conditions if, if...else et if... elseif... else
  8. Utilisation avancée des conditions
  9. Structures ternaires et switch
  10. Les boucles PHP
  11. Découverte des fonctions
  12. La portée des variables
  13. Les constantes PHP
  14. Les variables tableaux PHP
  15. Tableaux associatifs
  16. Tableaux multidimensionnels
  17. Test n°1

Gestion des dates en PHP

  1. Le timestamp
  2. Obtenir et formater une date
  3. Tester la validité d'une date
  4. Test n°2

Opérations sur les fichiers en PHP

  1. Lire, ouvrir, fermer un fichier
  2. Parcourir et lire un fichier par partie
  3. Créer un fichier et écrire dedans
  4. Ecrire dans un fichier
  5. Les instructions include et require
  6. Test n°3

Les variables superglobales

  1. Découverte des variables superglobales
  2. Les cookies
  3. Les sessions
  4. Test n°4

Les expressions régulières et PHP

  1. Découverte des regex
  2. Les fonctions PHP PCRE
  3. Quantifieurs et options
  4. Classes de caractères
  5. Test n°5

L'orienté objet en PHP

  1. Classes, instances et objets
  2. Propriétés et méthodes
  3. Extension de classe et héritage
  4. Le principe d'encapsulation
  5. La méthode constructeur
  6. L'opérateur de résolution de portée et la surcharge
  7. Constantes, méthodes et propriétés statiques
  8. Les classes et méthodes abstraites
  9. Les interfaces
  10. Les méthodes magiques
  11. Le chainage de méthodes
  12. Test n°6

Notions avancées en POO

  1. Le typage explicite
  2. Les traits
  3. Les closures et les classes anonymes
  4. L'auto-chargement des classes
  5. Le mot clef final
  6. Résolution statique à la volée
  7. Parcourir des objets
  8. Le clonage d'objets
  9. Comparaison d'objets
  10. Test n°7

Filtres, erreurs et exceptions

  1. Introduction aux filtres
  2. Utilisation pratique des filtres
  3. Gérer les erreurs en PHP
  4. Gérer les exceptions en PHP

LES METHODES MAGIQUES EN PROGRAMMATION ORIENTEE OBJET PHP

Définition et utilité des méthodes magiques

Les méthodes magiques sont des méthodes qui vont être appelées automatiquement dans le cas d’un évènement particulier.

La méthode __construct(), par exemple, est une méthode magique. En effet, cette méthode s’exécute automatiquement dès que l’on instancie une classe dans laquelle on a défini un constructeur.

Les méthodes magiques sont faciles à reconnaitre en PHP : ce sont les seules à commencer par un double underscore __.

Voici la liste de toutes les méthodes magiques disponibles par défaut en PHP (version PHP 7.1) :

  • __construct() ;
  • __destruct() ;
  • __call() ;
  • __callStatic() ;
  • __get() ;
  • __set() ;
  • __isset() ;
  • __unset() ;
  • __toString() ;
  • __clone() ;
  • __sleep() ;
  • __wakeup() ;
  • __invoke() ;
  • __set_state() ;
  • __debugInfo().

Nous allons étudier chacune d’entre elles dans la suite de ce chapitre et donc découvrir leurs différentes fonctions et conditions d’utilisations.

Ces méthodes magiques vont se révéler très utiles dans de nombreuses situations !

Les méthodes magiques __construct() et __destruct()

Nous connaissons déjà la méthode magique __construct() qui va être appelée dès qu’on va instancier une classe possédant un constructeur.

Cette méthode est très utile pour initialiser les valeurs dont un objet a besoin dès sa création et avant toute utilisation de celui-ci.

La méthode magique __destruct(), également appelée méthode destructeur, est la méthode « contraire » de la fonction constructeur.

Cette méthode va être appelée dès qu’il n’y a plus de référence sur un objet donné ou dès qu’un objet n’existe plus dans le contexte d’une certaine application. Bien évidemment, pour que le destructeur soit appelé, vous devrez le définir dans la définition de la classe tout comme on a l’habitude de le faire avec le constructeur.

Le destructeur va nous servir à « nettoyer » le code en détruisant un objet une fois qu’on a fini de l’utiliser. Définir un destructeur va être particulièrement utile pour effectuer des opérations juste avant que l’objet soit détruit.

En effet, en utilisant un destructeur nous avons la maitrise sur le moment exact où l’objet va être détruit. Ainsi, on va pouvoir exécuter au sein de notre destructeur différentes commandes comme sauvegarder des dernières valeurs de l’objet dans une base de données, fermer la connexion à une base de données, etc. juste avant que celui-ci soit détruit.

Définissons immédiatement un destructeur afin de voir en pratique comment il va fonctionner. Pour cet exemple, nous allons reprendre nos classes Humain et Francais créées précédemment et ajouter un destructeur dans cette dernière.

On commence par récupérer notre classe parent

On définit un destructeur pour notre classe enfant en POO PHP

On crée un objet et on l'utilise en POO PHP

Notre destructeur détruit notre objet en fin de script

Dans le code ci-dessus, notre destructeur n’a certes pas grande utilité : on echo simplement un message confirmant la destruction de l’objet. Cependant, nous pourrons avec une plus grande connaissance du PHP et du SQL performer des opérations de sauvegarde de données, de fermeture de connexion à une base de données, etc. au sein de votre destructeur.

Les méthodes magiques __call() et __callStatic()

La méthode magique __call() s’exécute dès qu’on essaie d’utiliser une méthode qui n’existe pas (ou qui est inaccessible) à partir d’un objet. On va passer deux arguments à cette méthode : le nom de la méthode qu’on essaie d’exécuter ainsi que les arguments relatifs à celle-ci. Ces arguments vont être convertis en un tableau.

La méthode magique __callStatic() s’exécute dès qu’on essaie d’utiliser une méthode qui n’existe pas (ou qui est inaccessible) dans un contexte statique cette fois-ci. Cette méthode accepte les mêmes arguments que __call().

Ces deux méthodes vont donc s’avérer très utiles pour contrôler un script et pour éviter des erreurs fatales qui l’empêcheraient de s’exécuter convenablement ou même pour prévenir des failles de sécurité.

Illustrons le fonctionnement de ces deux méthodes magiques avec un nouvel exemple.

On met à jour notre classe parent

On définit les méthodes magiques call et callstatic en POO PHP

Ici, vous pouvez déjà voir que j’ai supprimé tout ce qui était relatif à l’adresse de notre objet afin que l’on puisse plus précisément se concentrer sur nos méthodes magiques.

On va donc définir nos deux méthodes magiques _call() et __callStatic() dans notre classe Francais.

Dès qu’on va tenter d’appeler une méthode qui n’existe pas ou qui n’est pas accessible, l’une ou l’autre de ces deux méthodes va se déclencher selon le contexte d’appel de la méthode et va afficher le message contenu dans l'instruction echo correspondante.

Notez au passage que la méthode __callStatic() est elle-même une méthode magique statique. On doit donc préciser le mot clef static lors de sa définition.

Notez qu’ici on utilise le même nom pour les paramètres de nos deux méthodes. Ce n’est généralement pas quelque chose de recommandé (car cela dégrade la clarté générale d’un script et peut mener à des erreurs) mais je me le permets pour un script court comme celui-ci.

Opérations sur des objets en POO PHP

On utilise les méthodes magiques call et callstatic dans différents contextes en POO PHP

Ensuite on tente dans notre script principal d’appeler deux méthodes essai() et test() tout d’abord dans un contexte objet puis dans un contexte statique.

Comme ces deux méthodes n’existent pas, __call() et __callStatic() vont se déclencher à chaque fois.

Les méthodes magiques __get(), __set(), __isset() et __unset()

La méthode magique __get() va s’exécuter si on tente d’accéder à une propriété inaccessible (ou qui n’existe pas) dans une classe. Elle va prendre en argument le nom de la propriété à laquelle on souhaite accéder.

La méthode magique __set() s’exécute dès qu’on tente de créer ou de mettre à jour une propriété inaccessible (ou qui n’existe pas) dans une classe. Cette méthode va prendre comme arguments le nom et la valeur de la propriété qu’on tente de créer ou de mettre à jour.

On définit des méthodes magiques get et set en POO PHP

On tente d'utiliser des propriétés inaccessibles en POO PHP

On déclenche l'exécution des méthodes magiques get et set en POO PHP

La méthode magique __isset() va s’exécuter lorsque les fonctions isset() ou empty() sont appelées sur des propriétés inaccessibles.

La fonction issset() va servir à déterminer si une variable est définie et si elle est différente de NULL tandis que la fonction empty() permet de déterminer si une variable est vide.

De même, la méthode magique __unset() va s’exécuter lorsque la fonction unset() est appelée sur des propriétés inaccessibles.

La fonction unset() sert à détruire une variable.

On simplifie le code de notre classe parent

On définit nos méthodes magiques isset et unset en PHP POO

Ici on définit un constructeur pour notre classe Francais qui va initialiser deux propriétés $nom et $nomF pour les objets créés à partir de celui-ci.

On définit également dans notre fichier de classes nos deux méthodes magiques __isset() et __unset().

Ensuite, on effectue différentes opérations dans notre fichier de script principal.

Exemple utilisation méthodes magiques isset unset POO PHP

Résultat de l'exécution des méthodes magiques isset et unset en POO PHP

On commence par tester si la propriété $age est accessible avec la fonction isset(). Comme cette propriété n’existe pas, la méthode __isset() va s’exécuter et le message qu’elle contient va être affiché. Notez qu’on utilise également var_dump() pour afficher le résultat renvoyé par isset() qui va être un booléen (true si la propriété est accessible, false dans le cas contraire).

Ensuite on détruit la propriété $age avec unset(). Notez qu’on peut tout à fait utiliser cette fonction même si la propriété en question n’existait pas à la base/

Comme $age est inaccessible, la méthode __unset() se déclenche également et renvoie le message qu’elle contient.

Ensuite, on effectue les mêmes opérations avec la propriété $nomF qui est elle bien accessible puisqu’on l’a définie avec le mot clef public dans notre classe.

Notez que lorsqu’on utilise unset() avec $nomF, la propriété $nomF est belle et bien accessible et il est donc normal que la méthode __unset() ne se déclenche pas puisque celle-ci ne se déclenche que si la fonction unset() est appelée sur des propriétés inaccessibles.

Finalement, notez bien entendu que la surcharge de propriétés ne fonctionne que dans un contexte objet (c’est-à-dire non statique). Par conséquent, les méthodes étudiées ci-dessus ne doivent jamais être déclarées comme statiques.

La méthode magique __toString()

La méthode magique __toString() va s’exécuter dès que l’on va traiter un objet comme une chaine de caractères (par exemple lorsqu’on tente d’echo l’objet en soi).

Attention, cette méthode doit obligatoirement retourner une chaine ou une erreur sera levée par le PHP.

Notre classe parent en POO PHP

Définition de la méthode magique toString en POO PHP

Exemple d'utilisation de la méthode magique toString en POO PHP

Résultat de l'utilisation de la méthode magique toString en POO PHP

La méthode magique __invoke()

La méthode __invoke va s’exécuter dès qu’on tente d’appeler un objet comme une fonction.

Notre classe parent en POO PHP

Définition de la méthode magique invoke en POO PHP

Exemple d'utilisation de la méthode magique invoke en POO PHP

Résultat de l'utilisation de la méthode magique invoke en POO PHP

La méthode magique __clone()

La méthode magique __clone() s’exécute dès que l’on crée un clone d’un objet pour le nouvel objet créé.

Cette méthode va nous permettre notamment de modifier les propriétés qui doivent l’être après avoir créé un clone pour le clone en question.

Nous parlerons du clonage d’objet dans un chapitre ultérieur, je ne vais donc pas m’attarder sur cette méthode magique pour le moment.

Autres méthodes magiques

Nous n’étudierons pas non plus ici les méthodes magiques __sleep(), __wakeup(), __set_state() et debugInfo() simplement car elles répondent à des besoins très précis et demandent un setup spécifique et par conséquent elles ne sont que très peu utilisées.

De plus, à votre niveau, il est probable que l’explication du fonctionnement de ces différentes méthodes ainsi que leur intérêt risquent de vous échapper.

Chapitre précédent

Chapitre suivant