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 : HERITAGE ET CLASSES ETENDUES

Quel intérêt d’étendre des classes ?

Vous devriez maintenant normalement commencer à comprendre la syntaxe générale utilisée en POO PHP.

Cependant, jusqu’à présent, il nous a été difficile d’illustrer véritablement de façon concrète les avantages à utiliser la POO plutôt que le procédural en PHP. Pas d’inquiétude, on y arrive !

Un des grands intérêts de la POO est qu’on va pouvoir rendre notre code très modulable, ce qui va être très utile pour gérer un gros projet ou si on souhaite le distribuer à d’autres développeurs.

En effet, il va être possible en POO d’étendre (les possibilités) de classes existantes plutôt que de modifier les scripts en soi, c’est-à-dire de créer de nouvelles classes possédant de nouvelles propriétés et méthodes à partir d’une classe déjà existante.

Les classes étendues vont hériter des méthodes et propriétés de la classes qu’elles étendent (sous réserve d’y avoir accès).

Certains développeurs vont ainsi pouvoir proposer de nouvelles fonctionnalités sans casser la structure de notre code et de nos scripts. C’est d’ailleurs tout le principe de la solution e-commerce PrestaShop (nous reparlerons de cela en fin de chapitre).

Etendre des classes en pratique

Nous allons pouvoir étendre une classe grâce au mot clef extends. En utilisant ce mot clef, on va créer une classe « fille » qui va hériter de toutes les propriétés et méthodes de son parent par défaut et qui va pouvoir les manipuler de la même façon (à condition de pouvoir y accéder).

Illustrons immédiatement cela en créant une nouvelle classe Francais qui va étendre notre classe Humain par exemple.

Nous allons créer cette classe dans un nouveau fichier en utilisant le mot clef extends comme cela :

On peut étendre une classe en POO PHP avec le mot clef extends

Notre classe Francais étend la classe Humain. Elle hérite donc de toutes les propriétés et méthodes non définies comme étant private de la classe Humain.

On va donc pouvoir créer un objet à partir de notre classe Francais et utiliser les méthodes définies dans notre classe Humain.

Faites bien attention cependant à bien inclure les deux classes dans le fichier de script principal car pour étendre une classe mère il va nous falloir la classe mère et sa fille.

On inclut la classe mère et la fille pour pouvoir utiliser la fille en POO PHP

On a accès aux méthodes de notre classe mère depuis l'objet appartenant à notre classe fille

Le grand intérêt ici est qu’on va pouvoir ajouter des propriétés et méthodes dans notre classe fille ou encore modifier les propriétés et méthodes de notre classe mère dans notre classe fille sans impacter la classe mère.

Prenons immédiatement un exemple concret. Nous allons déjà devoir commencer par changer le niveau d’accessibilité de notre propriété $nom dans la classe Humain

On va utiliser le mot clef protected qui signifie qu’on va avoir accès à la propriété dans la classe mère ainsi que dans les classes qui l’étendent.

On utilise le mot clef protected en POO PHP pour avoir un accès depuis une classe fille

Ensuite, nous allons faire deux choses dans notre classe Francais : nous allons modifier le code de la méthode setNom() définie dans la classe parent Humain et nous allons également créer deux méthodes et une propriété exclusives à notre classe fille.

Héritage et création de méthodes exclusives à une classe fille POO PHP

Ces script est très intéressant à analyser. Comme vous le voyez, on commence par modifier la code de notre méthode setNom() en la déclarant à nouveau. Ici, on va juste vouloir mettre le nom passé en argument en majuscules, d’où l’utilisation de la fonction strtoupper() qui transforme une chaine de caractères en majuscules.

Notez qu’on n’a pas à redéclarer notre propriété $nom ni a réécrire notre méthode getNom() puisque notre classe fille hérite de ces propriété et méthode. C’est tout l’intérêt d’étendre des classes et de l’héritage.

Ensuite, nous ajoutons une propriété $postal et deux méthodes setPostal() et getPostal() qui vont être exclusives à notre classe fille (à moins qu’on étende à nouveau notre classe fille bien entendu).

Le rôle de ces méthodes est simplement de permettre la définition et l'affichage d'un code postal.

Exécutons maintenant tout ce code afin de voir le résultat produit.

Test des méthodes exclusives à notre classe fille et de l'héritage

Notre classe fille a accès aux méthodes et propriétés de son parent

Ici, on crée deux nouveaux objets : l’objet $victor qui appartient à Humain et l’objet $pierre qui appartient à Français.

Comme vous pouvez le voir, notre prénom PIERRE apparait bien en majuscules et on a pu définir un code postal relatif à $pierre.

Notez bien une nouvelle fois que l’héritage se fait dans un sens unique : les modifications créées dans une classe fille n’impacteront pas la classe mère.

Notez également qu’on va pouvoir étendre nos classes à l’infini (ici, par exemple, on pourrait tout à fait étendre notre classe Français) et que l’héritage traverse les générations : les classes filles de Français hériteraient des méthodes et propriétés de Français mais également de celles de leur grand parent Humain.

Comprendre l’intérêt et les risques d’étendre des classes en pratique avec l’exemple de PrestaShop

L’architecture du célébre logiciel e-commerce PrestaShop a été créée en orienté objet PHP.

Cela rend PrestaShop modulable à l’infini et permet à des développeurs externes de développer de nouvelles fonctionnalités pour la solution.

En effet, le logiciel PrestaShop de base contient déjà de nombreuses classes et certaines vont pouvoir être étendues par des développeurs externes tandis que d’autres, plus sensibles ou essentielles au fonctionnement de la solution (ce qu’on appelle des classes « cœurs ») vont avoir un accès limité.

Le fait d’avoir créé PrestaShop de cette manière est une formidable idée puisque ça permet aux développeurs de développer de nouveaux modules qui vont s’intégrer parfaitement à la solution en prenant appui sur des classes déjà existantes dans PrestaShop.

Cependant, c’est également le point principal de risque et l’ambiguïté majeure par rapport à la qualité de cette solution pour deux raisons.

Le premier problème qui peut survenir est que certains développeurs peuvent par mégarde ou tout simplement par manque d’application surcharger (c’est-à-dire réécrire ou encore substituer) certaines méthodes ou propriétés de classes lorsqu’ils créent leurs modules et le faire d’une façon qui va amener des bugs et des problèmes de sécurité sur les boutiques en cas d’installation du module en question. A priori, l’équipe de validation des modules de PrestaShop est là pour éviter que ce genre de modules passent et se retrouvent sur la place de marché officielle.

Le deuxième problème est beaucoup plus insidieux et malheureusement quasiment impossible à éviter : imaginons que vous installiez plusieurs modules de développeurs différents sur votre solution de PrestaShop de base. Si vous êtes malchanceux, il est possible que certains d’entre eux tentent d’étendre une même classe et donc de surcharger les mêmes méthodes ou propriétés, ou encore utilisent un même nom en créant une nouvelle classe ou en étendant une classe existante. Dans ce cas là, il y aura bien entendu un conflit dans le code et selon la gravité de celui-ci cela peut faire totalement planter votre boutique. Le problème étant ici que vous n’avez aucun moyen d’anticiper cela à priori lorsque vous êtes simple marchand et non un développeur aguerri.

Finalement, notez que si vous créez une architecture en POO PHP et que donc vous laissez la possibilité à des développeurs externes de modifier ou d’étendre cette architecture, vous devrez toujours faire bien attention à proposer une rétrocompatibilité de votre code à chaque mise à jour importante. En effet, imaginons que vous modifiiez une classe de votre architecture : vous devrez toujours faire en sorte que les codes d’autres développeurs utilisant cette classe avant la mise à jour restent valides pour ne pas que tout leur code plante lorsqu’ils vont eux-mêmes mettre la solution à jour (ou tout au moins les prévenir avant de mettre la mise à jour en production pour qu’ils puissent adapter leur code).

Chapitre précédent

Chapitre suivant