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

POO PHP : LES TRAITS

Introduction et définition des Traits en PHP

Les Traits sont apparus avec la version 5.4 du PHP. Très simplement, les Traits correspondent à un mécanisme nous permettant de réutiliser des méthodes dans des classes indépendantes, repoussant ainsi les limites de l’héritage traditionnel.

En effet, rappelez-vous qu’en PHP une classe ne peut hériter que d’une seule classe mère.

Or, imaginons que nous devions définir la même opération au sein de plusieurs classes différentes indépendantes. Il serait dommage d’avoir à réécrire le code correspondant à ces opérations à chaque fois. Les Traits vont nous permettre de résoudre précisément ce problème.

Comprendre l’intérêt et l’utilité des Traits

Essayons de bien comprendre tout l’intérêt et toute la puissance des Traits à travers un premier exemple. Imaginons que nous ayons deux classes indépendantes Humain et Animal.

Ces deux classes vont partager des fonctions communes comme le fait de pouvoir avancer qui va être défini par une méthode enAvant() par exemple.

Si nous n’utilisons pas les Traits, nous allons être obligés de réécrire le code de cette méthode dans chaque classe puisque nos deux classes sont indépendantes (il n’y aurait aucune logique à ce qu’une classe étende l’autre ici).

Nous allons donc écrire quelque chose comme cela :

Illustration de l'intérêt d'utiliser les traits en POO PHP

Sans utiliser les traits, nous devons réécrire nos méthodes

Bien évidemment, il faut ici vous imaginer que nos classes vont pouvoir posséder de nombreuses autre méthodes spécifiques que je n’écris pas ici.

Si on tente d’exécuter la méthode enAvant() avec un objet Humain et un Animal, tout fonctionne bien :

Nos méthodes s'exécutent bien mais le code n'est pas optimisé

Résultat des méthodes sans utilisation des traits en POO PHP

Ici, une nouvelle fois, le code fonctionne très bien, il n’est juste pas optimisé. En effet, imaginez maintenant que nous ayons une dizaine de classes partageant plusieurs méthodes… Cela fait beaucoup de code écrit pour rien et en cas de modification d’une méthode il faudra modifier chaque classe, ce qui est loin d’être optimal !

Utilisons donc maintenant les Traits pour optimiser notre code.

Utilisation des Traits en pratique

On va définir un Trait de façon relativement similaire à une classe, à la différence que nous allons utiliser le mot clef trait suivi du nom de notre Trait.

Une bonne pratique consiste à utiliser un nouveau fichier pour chaque nouveau Trait (on inclura ensuite les Traits dans les classes qui en ont besoin).

Dans notre cas, je vais créer un Trait que j’appelle Methodes.

Dans celui-ci, je vais placer mes propriétés $nom et $x ainsi que mes méthodes getNom() et enAvant() qui sont communes à mes classes Humain et Animal.

Notez qu’on peut tout à fait inclure des propriétés dans nos Traits. Il faut cependant faire bien attention à la visibilité de celles-ci et ne pas abuser de cela au risque d’avoir un code au final moins clair et plus faillible.

Définition d'un premier trait en POO PHP

Ensuite, nous n’avons plus qu’à inclure notre Trait dans les classes avec une instruction de type include() ou require() si l’on souhaite être plus strict.

Dans le cas présent, j’ai placé le fichier relatif à mon Trait dans le même dossier que mes fichiers de classe.

Utilisation de notre trait dans une classe PHP

Inclusion d'n trait dans plusieurs classe PHP

On peut tenter d’exécuter ce code, vous allez voir qu’il fonctionne tout aussi bien que précédemment.

On exécute les méthodes déclarées dans notre trait en PHP

Nos méthodes s'exécutent bien et renvoient le même résultat que précédemment

Utiliser un Trait nous a permis de n’avoir à définir qu’une seule fois des méthodes et de pouvoir les réutiliser dans des classes indépendantes.

Ordre de précédence (ordre de priorité)

Dans le cas où une classe hérite d’une méthode d’une classe mère, celle-ci va être écrasée par une méthode (du même nom, bien évidemment) provenant d’un Trait.

En revanche, dans le cas où une classe définit elle-même une méthode, celle-ci sera prédominante par rapport à celle du Trait.

Ainsi, une méthode issue de la classe elle-même sera prioritaire sur celle venant d’un Trait qui sera elle-même prédominante par rapport à une méthode héritée d’une classe mère.

Prenons immédiatement un exemple pour illustrer cela. Pour cet exemple, nous allons récupérer nos deux classes Humain et Francais.

Définition méthode dans la classe parent précédence trait PHP POO

Définition méthode dans la classe de base précédence trait PHP POO

Définition méthodes dans le trait précédence trait PHP POO

Notez pour commencer qu’on utilise le Trait Methodes avec notre classe Francais uniquement cette fois-ci.

Pour l’exemple, on définit deux méthodes hello() et bye() qui se contentent d'afficher un message.

On définit notre méthode hello() à la fois dans Francais, Humain et dans notre Trait en affichant un message légèrement différent à chaque fois pour pouvoir voir laquelle de ces écritures va être prioritaire.

On définit notre méthode bye() de la même façon mais uniquement dans la classe parent Humain et dans notre Trait.

Illustration de la précédence avec les traits en PHP

Ensuite, on exécute nos deux méthodes à partir d’un objet issu de la classe Francais dans notre script principal afin de constater les résultats.

Priorité d'exécution des méthodes en POO PHP

Comme vous pouvez le voir, c’est l’écriture présente dans notre classe en soi qui est prioritaire puisqu’on peut lire « bonjour de la classe » pour la méthode hello().

Notre deuxième méthode, bye(), n’a été définie que dans la classe parent et dans le Trait et c’est bien l’écriture présente dans le Trait qui est prioritaire.

Inclusion de plusieurs Traits

La première des choses à savoir ici est qu’une classe peut utiliser plusieurs Traits. Pour cela, il suffit à nouveau d’utiliser le mot clef use et séparer les noms des différents Traits par une virgule.

Créons deux nouveaux fichiers de Trait appelés bonjour.trait.php et aurevoir.trait.php qu’on va enregistrer dans le même dossier que nos autres fichiers de classe.

Définition de plusieurs traits en POO PHP

Définition de plusieurs traits en POO PHP

Nos deux fichiers de Traits ne contiennent qu’une méthode très simple à chaque fois que vous devriez comprendre sans problème.

Ensuite, on n’a plus qu’à inclure nos Traits dans notre classe et déclarer leur utilisation avec le mot clef use.

Utilisation de plusieurs traits dans une classe en POO PHP

Finalement, on exécute nos différentes méthodes depuis notre script principal afin de constater les résultats.

Inclusion de plsieurs traits en POO PHP et exécution méthodes

Nos méthodes issues des traits s'exécutent bien

Résolution des conflits entre Traits

Notez que si deux Traits insèrent une méthode de même nom dans une classe, le PHP va renvoyer une erreur fatale.

Par exemple, imaginons que l’on souhaite utiliser dans notre classe Francais nos trois Traits Methodes, Bonjour et AuRevoir que l’on va légèrement modifier pour l’occasion comme ceci :

On définit une première méthode dans un premier trait

On définit ne autre méthode dans un deuxième trait

On redéfinit les deux méthodes précédentes dans un troisième trait

On utilise différents traits définissant la même méthode dans notre classe

On tente d'exécuter une méthode définie dans plusieurs traits en POO PHP

Ici, le PHP ne peut pas déterminer laquelle des méthodes hello() et bye() il doit utiliser et va renvoyer une erreur fatale.

Le PHP ne peut pas choisir quelle méthode exécuter et renvoie une erreur fatale

Pour résoudre ce genre de conflits (dans le cas où vous ne pouvez pas simplement ne pas inclure un Trait), nous avons deux solutions : on peut soit utiliser l’opérateur insteadof pour indiquer la préférence d’une des méthodes en conflit, soit utiliser l’opérateur as pour renommer une méthode dans le cas où l’on souhaite utiliser les deux méthodes en conflit.

Résolution des conflits de trait en POO PHP

Notez bien la syntaxe avec l’utilisation de insteadof et as : l’utilisation du double deux-points, du couple d’accolades, etc.

Utilisation de insteadof et as pour résoudre les conflits de collision des traits en POO PHP

Nos méthodes s'exécutent bien grâce aux opérateurs insteadof et as en PHP

Héritage de Traits

Vous devez finalement savoir que des Traits peuvent eux-même utiliser d’autres Traits et hériter de tout ou d’une partie de ceux-ci.

Pour cela, on va à nouveau utiliser le mot clef use pour utiliser un Trait dans un autre.

Voilà comment on va s’y prendre en pratique :

Inclusion de traits dans un trait en programmation orientée objet PHP

On utilise notre trait utilisant lui même d'autres traits

Utilisation des méthodes héritées par notre trait via la classe

Nos méthodes de traits héritées s'exécutent bien

Chapitre précédent

Chapitre suivant