3.2Programmation orientée objet (classes, héritage, interfaces, traits)
La programmation orientée objet (POO) est un PARADIGME de programmation central dans le PHP moderne et indispensable pour les frameworks (niveau 4). Jusqu'ici, vous avez programmé de façon « procédurale » (des fonctions, des variables). La POO propose une autre façon de PENSER et d'ORGANISER le code : autour d'objets qui regroupent des DONNÉES et des COMPORTEMENTS. Le concept de base est la classe : un « modèle » (un plan) qui définit un type d'objet, avec ses propriétés (les données : un utilisateur a un nom, un email) et ses méthodes (les comportements/fonctions : un utilisateur peut se connecter, changer de mot de passe). On CRÉE ensuite des objets (des « instances ») à partir de la classe : $user = new User(); crée un objet User. À l'intérieur d'une classe, le mot-clé $this désigne l'objet courant ($this->nom accède à sa propriété nom). Le constructeur (__construct()) est une méthode spéciale appelée à la création de l'objet, pour l'initialiser. La POO permet de MODÉLISER le monde réel (un utilisateur, un produit, une commande deviennent des classes/objets) de façon naturelle et organisée.
Les quatre grands principes de la POO. (1) L'ENCAPSULATION : regrouper données et comportements dans un objet, et CONTRÔLER l'accès à ses données via la VISIBILITÉ — public (accessible partout), private (accessible seulement dans la classe), protected (dans la classe et ses descendantes). On rend généralement les propriétés private et on y accède via des méthodes (getters/setters), pour PROTÉGER l'état de l'objet (empêcher des modifications incohérentes) — un principe clé de robustesse. (2) L'HÉRITAGE : une classe peut HÉRITER d'une autre (class Admin extends User) — Admin obtient les propriétés et méthodes de User, et peut en ajouter ou en REDÉFINIR. Cela permet la RÉUTILISATION et la spécialisation (une hiérarchie de classes). (3) Le POLYMORPHISME : des objets de classes différentes peuvent répondre à la même méthode de façon différente (chacun sa propre implémentation) — puissant pour écrire du code générique. (4) L'ABSTRACTION : masquer la complexité derrière des interfaces simples. Deux outils importants pour structurer la POO : les interfaces — un « contrat » qui définit des méthodes qu'une classe DOIT implémenter (sans dire comment) ; une classe qui « implémente » une interface s'engage à fournir ces méthodes. Les interfaces permettent de programmer « par contrat » et de découpler le code (on dépend d'une interface, pas d'une implémentation concrète) — essentiel pour un code flexible et testable. Et les traits — un moyen de RÉUTILISER des méthodes dans plusieurs classes sans héritage (PHP ne permettant qu'un seul héritage, les traits comblent ce besoin de partage horizontal). PHP moderne offre une POO complète et riche (classes abstraites, constantes de classe, propriétés/méthodes statiques, énumérations, typage des propriétés, etc.). Comprendre la POO — penser en objets (données + comportements), maîtriser encapsulation, héritage, polymorphisme, interfaces — est un CAP majeur : c'est le paradigme du PHP moderne et des frameworks, ce qui permet de structurer des applications complexes de façon organisée, réutilisable et maintenable. C'est aussi un changement de FAÇON DE PENSER qui demande de la pratique, mais qui ouvre la porte à tout le développement PHP professionnel.
Vocabulaire de la section
- POO / Classe / Objet
- Paradigme organisant le code autour d'OBJETS (données + comportements). Une CLASSE est un modèle (propriétés + méthodes) ; un OBJET est une instance (`new User()`). $this = l'objet courant ; __construct = constructeur (initialisation).
- Encapsulation / visibilité
- Regrouper données et comportements, et contrôler l'accès via la visibilité : public (partout), private (classe seule), protected (classe + descendantes). Propriétés private + getters/setters pour protéger l'état.
- Héritage
- Une classe hérite d'une autre (`class Admin extends User`) : elle obtient ses propriétés/méthodes, peut en ajouter ou REDÉFINIR ; permet réutilisation et spécialisation.
- Polymorphisme / abstraction
- Polymorphisme : des objets de classes différentes répondent à la même méthode différemment. Abstraction : masquer la complexité derrière des interfaces simples.
- Interfaces / traits
- Interface : « contrat » de méthodes qu'une classe doit implémenter (programmer par contrat, découpler). Trait : réutiliser des méthodes dans plusieurs classes sans héritage (partage horizontal).
Faut-il définir des schémas / penser en objets, et qu'apporte la POO ?
En pratique — Penser et programmer en objets
- Créez une classe (ex. User) avec des propriétés (nom, email) et des méthodes ; instanciez un objet avec `new`, initialisez via le constructeur (__construct), utilisez $this.
- Appliquez l'ENCAPSULATION : rendez les propriétés private et accédez-y via des méthodes (getters/setters) ; typez les propriétés.
- Créez une classe qui HÉRITE d'une autre (extends) et REDÉFINIT une méthode ; observez la réutilisation et la spécialisation.
- Définissez une INTERFACE (un contrat de méthodes) et une classe qui l'implémente ; explorez un trait pour partager des méthodes.
Points clés à retenir
- La POO organise le code autour d'OBJETS (données + comportements). CLASSE = modèle (propriétés + méthodes) ; OBJET = instance (`new User()`). $this = l'objet courant ; __construct = constructeur.
- ENCAPSULATION : contrôler l'accès aux données via la VISIBILITÉ (public/private/protected) ; propriétés private + getters/setters pour protéger l'état. HÉRITAGE (`extends`) : réutiliser et spécialiser.
- POLYMORPHISME (même méthode, implémentations différentes) et ABSTRACTION. INTERFACES = contrats (programmer par contrat, découpler) ; TRAITS = partage de méthodes sans héritage.
- La POO est le CAP majeur du PHP moderne et des FRAMEWORKS : structurer des applications complexes de façon organisée, réutilisable, maintenable. Un changement de façon de penser qui demande de la pratique.
Questions fréquentes
Pourquoi passer à la POO alors que la programmation procédurale fonctionne — qu'apporte-t-elle vraiment ?
La POO (programmation orientée objet) apporte une façon d'ORGANISER le code qui devient indispensable dès que les applications grandissent, et qui est le paradigme du PHP moderne et des frameworks — comprendre ce qu'elle apporte motive à franchir ce cap (qui demande un vrai changement de pensée). La programmation procédurale (fonctions + variables) fonctionne pour des scripts simples, mais montre ses limites sur des applications complexes : le code se disperse (des fonctions et des données éparpillées, sans structure claire), il devient difficile de savoir quelles fonctions vont avec quelles données, la réutilisation et la maintenance se compliquent. La POO répond à ces limites. Ce que la POO apporte : (1) ORGANISATION : regrouper données et comportements. En procédural, les données (variables) et les fonctions qui les manipulent sont SÉPARÉES et dispersées. En POO, on les REGROUPE dans des OBJETS : un objet Utilisateur contient ses DONNÉES (nom, email) ET ses COMPORTEMENTS (se connecter, changer de mot de passe). Tout ce qui concerne un utilisateur est à un endroit, cohérent. Le code devient organisé autour des « choses » du domaine (utilisateurs, produits, commandes), ce qui est naturel et clair. (2) MODÉLISATION du monde réel. La POO permet de modéliser naturellement les entités de votre domaine (un utilisateur, une commande, un produit deviennent des classes) avec leurs propriétés et comportements. Le code « ressemble » au problème qu'il résout, ce qui le rend plus compréhensible. (3) ENCAPSULATION : protéger l'état. En rendant les données PRIVÉES et en contrôlant leur accès (via des méthodes), on PROTÈGE l'état des objets contre les modifications incohérentes (on ne peut pas mettre un email invalide directement — on passe par une méthode qui valide). Cela rend le code plus ROBUSTE (l'objet garantit sa propre cohérence). En procédural, les données sont exposées et modifiables n'importe comment (source de bugs). (4) RÉUTILISATION : héritage et composition. L'héritage permet de réutiliser et spécialiser (une classe Admin hérite de User et ajoute des capacités), les traits de partager des comportements. On évite la duplication en réutilisant proprement. (5) FLEXIBILITÉ : polymorphisme et interfaces. Le polymorphisme (des objets différents répondant à la même méthode différemment) et les interfaces (programmer par contrat) permettent d'écrire du code GÉNÉRIQUE et DÉCOUPLÉ (qui dépend d'abstractions, pas d'implémentations concrètes) — flexible, extensible, testable. (6) MAINTENABILITÉ et évolutivité. Un code POO bien conçu est plus facile à modifier, étendre, tester (on modifie une classe sans casser le reste, on teste des objets isolément). Le bénéfice croît avec la taille du projet. (7) C'est le PARADIGME du PHP MODERNE et des FRAMEWORKS. Point CRUCIAL : les frameworks PHP (Laravel, Symfony — niveau 4), les bibliothèques modernes, Composer, tout l'écosystème professionnel repose sur la POO. Pour utiliser un framework (indispensable en développement PHP sérieux), il FAUT comprendre la POO. C'est la porte d'entrée du PHP professionnel. Le CHANGEMENT DE PENSÉE (le cap à franchir) : passer du procédural à la POO n'est pas qu'apprendre une syntaxe — c'est CHANGER DE FAÇON DE PENSER. Au lieu de penser « quelles fonctions et variables », on pense « quels objets, avec quelles données et quels comportements, comment interagissent-ils ». Cette bascule mentale demande de la PRATIQUE (elle ne « clique » pas immédiatement — c'est normal de trouver la POO abstraite au début). Persévérez : une fois le déclic passé, la POO devient une façon naturelle et puissante de structurer le code. Quand la POO est-elle nécessaire vs procédural ? (1) Pour de PETITS scripts simples, le procédural peut suffire (pas besoin de sur-structurer). (2) Pour des APPLICATIONS réelles (qui grandissent, se maintiennent, utilisent des frameworks), la POO est indispensable. (3) En pratique, dès que vous visez le développement PHP sérieux (frameworks, projets structurés, emploi), la POO est incontournable. Conseils pour franchir le cap : (1) COMPRENEZ les concepts un par un (classe/objet, puis encapsulation, héritage, interfaces) — pas tout d'un coup. (2) PRATIQUEZ en modélisant des choses concrètes (une classe Utilisateur, Produit) — la POO s'apprend en faisant. (3) ACCEPTEZ que ça prenne du temps (le déclic vient avec la pratique). (4) OBSERVEZ comment les frameworks utilisent la POO (cela ancre les concepts dans un usage réel). En résumé : la POO apporte une ORGANISATION du code (regrouper données et comportements en objets), la MODÉLISATION du domaine, l'ENCAPSULATION (protéger l'état), la RÉUTILISATION (héritage, traits), la FLEXIBILITÉ (polymorphisme, interfaces), et la MAINTENABILITÉ — des bénéfices qui deviennent indispensables sur les applications réelles. Surtout, c'est le PARADIGME du PHP moderne et des FRAMEWORKS : incontournable pour le développement PHP professionnel. Passer à la POO demande un changement de pensée (penser en objets) qui s'acquiert par la pratique — c'est un cap majeur, mais qui ouvre tout le PHP sérieux. Ne restez pas en procédural par confort : la POO est la clé du PHP professionnel, et l'investir (avec de la pratique) transforme votre capacité à construire des applications structurées et évolutives.
Encapsulation, héritage, interfaces... ces concepts semblent abstraits : comment les comprendre concrètement ?
Les concepts de la POO peuvent sembler abstraits au début, mais ils répondent à des besoins CONCRETS d'organisation du code — les relier à des exemples et à leur utilité les rend clairs. Reprenons-les concrètement. (1) ENCAPSULATION — « protéger et regrouper ». Concrètement : un objet REGROUPE ses données et ses comportements, et CONTRÔLE qui peut toucher à ses données. Exemple : un objet CompteBancaire a un solde (donnée) et des méthodes deposer/retirer (comportements). Le solde est PRIVÉ (private) — on ne peut pas le modifier directement de l'extérieur (interdit de faire $compte->solde = 1000000 !). On passe par les méthodes deposer/retirer, qui VÉRIFIENT (pas de retrait si solde insuffisant, montant positif…). L'encapsulation PROTÈGE l'objet contre les modifications incohérentes : le solde ne peut changer que de façon contrôlée et valide. L'utilité concrète : la robustesse (l'objet garantit sa cohérence, on ne peut pas le mettre dans un état invalide). Sans encapsulation (données publiques modifiables n'importe comment), on ouvre la porte aux bugs (un solde négatif, un email invalide mis directement). La visibilité (public/private/protected) est l'outil : private pour ce qui doit être protégé, public pour l'interface qu'on expose. (2) HÉRITAGE — « est un type de ». Concrètement : une classe HÉRITE d'une autre pour RÉUTILISER et SPÉCIALISER. Exemple : une classe Animal avec des propriétés/méthodes communes (nom, manger, dormir) ; une classe Chien extends Animal HÉRITE de tout cela ET ajoute ses spécificités (aboyer). Un Chien EST UN Animal (relation « est un »), donc il a tout d'un Animal plus ses particularités. L'utilité concrète : la réutilisation (ne pas réécrire ce qui est commun) et la spécialisation (ajouter/redéfinir ce qui est spécifique). Autre exemple : Admin extends Utilisateur — un Admin a tout d'un Utilisateur (nom, email, connexion) plus des capacités d'administration. On évite de dupliquer le code d'Utilisateur. Attention : l'héritage exprime « EST UN » — n'héritez que si la relation a du sens (un Chien EST UN Animal ✓ ; mais pour « A UN » — une Voiture A UN Moteur —, on utilise la COMPOSITION, pas l'héritage). (3) POLYMORPHISME — « chacun à sa façon ». Concrètement : des objets de classes différentes répondent à la MÊME méthode de façon DIFFÉRENTE. Exemple : des classes Cercle, Carre, Triangle ont chacune une méthode calculerAire(), mais chacune la calcule à SA façon (formule différente). Vous pouvez alors écrire du code GÉNÉRIQUE : parcourir une liste de formes et appeler calculerAire() sur chacune — chaque forme répond correctement selon son type, sans que votre code ait à savoir laquelle c'est. L'utilité concrète : écrire du code générique et extensible (ajouter une nouvelle forme ne casse pas le code existant). C'est puissant pour traiter des objets variés de façon uniforme. (4) INTERFACES — « le contrat ». Concrètement : une interface DÉFINIT des méthodes qu'une classe DOIT fournir (un CONTRAT), sans dire COMMENT. Exemple : une interface MoyenDePaiement impose une méthode payer($montant). Des classes CarteBancaire, PayPal, Virement IMPLÉMENTENT cette interface — chacune fournit sa propre payer(). L'utilité concrète : programmer « par CONTRAT » et DÉCOUPLER. Votre code de commande peut travailler avec « un MoyenDePaiement » (l'interface) sans dépendre d'une classe concrète — vous pouvez ajouter un nouveau moyen de paiement sans changer le code de commande (il suffit qu'il implémente l'interface). C'est essentiel pour la FLEXIBILITÉ (changer d'implémentation) et la TESTABILITÉ (remplacer par une fausse implémentation en test). Les interfaces découplent « ce qu'on fait » (le contrat) de « comment on le fait » (l'implémentation). (5) TRAITS — « partager sans hériter ». Concrètement : un trait REGROUPE des méthodes réutilisables qu'on peut « injecter » dans plusieurs classes. Exemple : un trait Horodatable avec des méthodes de gestion de dates de création/modification, utilisé par plusieurs classes (Article, Utilisateur…) qui en ont besoin, sans lien d'héritage entre elles. L'utilité concrète : partager du comportement HORIZONTALEMENT (entre classes non liées par héritage), car PHP ne permet qu'un seul héritage. Comment bien COMPRENDRE ces concepts : (1) RELIEZ-les à leur UTILITÉ (le problème qu'ils résolvent), pas juste à leur définition : encapsulation → protéger l'état ; héritage → réutiliser/spécialiser ; polymorphisme → code générique ; interfaces → découpler et contractualiser ; traits → partager sans héritage. (2) UTILISEZ des exemples CONCRETS et parlants (compte bancaire, formes, moyens de paiement, animaux) — les analogies aident. (3) PRATIQUEZ en les appliquant (créer des classes, hériter, définir des interfaces) — la POO s'ancre en faisant. (4) OBSERVEZ les frameworks (Laravel, Symfony utilisent massivement ces concepts) — voir la POO en action réelle éclaire. (5) ACCEPTEZ la progressivité : ces concepts « cliquent » les uns après les autres, avec la pratique. En résumé : les concepts POO ne sont abstraits qu'en apparence — ils répondent à des besoins concrets : ENCAPSULATION (protéger l'état de l'objet, robustesse), HÉRITAGE (réutiliser/spécialiser, « est un »), POLYMORPHISME (code générique, chacun répond à sa façon), INTERFACES (contrat, découpler et rendre flexible/testable), TRAITS (partager du comportement sans héritage). Reliez chaque concept à SON UTILITÉ et à des exemples concrets, pratiquez, observez les frameworks — et progressivement, ces concepts deviennent des outils naturels de structuration. La POO est un langage pour organiser le code autour des « choses » du domaine et de leurs relations ; une fois ses concepts compris concrètement (par leur utilité), elle devient une façon puissante et intuitive de construire des applications structurées.