Révision de la redéfinition des méthodes
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 33 sur 91.
Vous avez déjà découvert la redéfinition des méthodes dans le chapitre sur l’héritage. Explorons maintenant son lien avec le polymorphisme — l’un des concepts les plus puissants de la programmation orientée objet.
Le polymorphisme signifie « plusieurs formes ». Lorsque tu redéfinis une méthode dans une classe enfant, tu donnes à cette méthode une forme différente tout en conservant le même nom. La magie opère lorsque tu travailles avec des objets via leur type parent :
<?php
class Animal {
public function speak() {
return "Some sound";
}
}
class Dog extends Animal {
public function speak() {
return "Woof!";
}
}
class Cat extends Animal {
public function speak() {
return "Meow!";
}
}
function makeAnimalSpeak(Animal $animal) {
return $animal->speak();
}
echo makeAnimalSpeak(new Dog()) . "\n";
echo makeAnimalSpeak(new Cat());
Sortie :
Woof!
Meow!La fonction makeAnimalSpeak() accepte n’importe quel Animal. Elle ne sait pas et ne se soucie pas de recevoir un Dog ou un Cat. PHP appelle automatiquement la méthode redéfinie correcte en fonction du type réel de l’objet lors de l’exécution.
C’est le polymorphisme en action.
Cette approche vous permet d’écrire un code flexible qui fonctionne avec une famille d’objets associés sans connaître leurs types spécifiques. Vous pouvez ajouter de nouvelles classes d’animaux ultérieurement, et la fonction fonctionnera automatiquement avec celles-ci.
Point clé : La redéfinition de méthode permet le polymorphisme en autorisant différentes classes à répondre différemment au même appel de méthode, selon le type réel de l’objet au moment de l’exécution.
Défi
FacileConstruisons un système d'instruments de musique qui démontre le polymorphisme grâce à la redéfinition de méthodes. Vous allez créer une classe de base Instrument et deux classes enfants qui produiront chacune leur propre son unique, puis utiliser une seule fonction pour jouer n'importe quel instrument de manière polymorphe.
Vous organiserez votre code sur quatre fichiers :
Instrument.php: créez une classeInstrumentavec une propriété$nameprotégée, définie par le constructeur. Ajoutez une méthodeplay()qui renvoie"[name] makes a sound". Cela constitue le comportement de base que les classes enfants redéfiniront.Guitar.php: créez une classeGuitarqui étendInstrument. Incluez le fichier parent. Le constructeur accepte le nom et le transmet au constructeur parent. Redéfinissez la méthodeplay()afin qu'elle renvoie"[name] strums a chord".Drum.php: créez une classeDrumqui étendInstrument. Incluez le fichier parent. Le constructeur accepte le nom et le transmet au constructeur parent. Redéfinissez la méthodeplay()afin qu'elle renvoie"[name] beats a rhythm".main.php: incluez les fichiers Guitar et Drum. Créez une fonction appeléeperformWithqui accepte un paramètreInstrument(avec indication de type) et renvoie le résultat de l'appel deplay()sur celui-ci. Cette fonction démontre le polymorphisme. Elle fonctionne avec n'importe quel type d'instrument grâce à l'indication du type de la classe parent.
Vous recevrez deux entrées : un nom pour la guitare et un nom pour le tambour. Créez un Guitar et un Drum avec ces noms. Transmettez chacun à votre fonction performWith() et affichez les résultats : d'abord la guitare, puis le tambour, chacun sur sa propre ligne.
Remarquez comment performWith() accepte n'importe quel Instrument, tandis que PHP appelle automatiquement la méthode play() redéfinie correcte en fonction du type réel de l'objet lors de l'exécution. C'est le polymorphisme en action !
Essayez vous-même
<?php
// Inclure les fichiers d'instruments
require_once 'Guitar.php';
require_once 'Drum.php';
// Lire l'entrée
$guitarName = trim(fgets(STDIN));
$drumName = trim(fgets(STDIN));
// TODO: Créer une fonction appelée performWith qui :
// - Accepte un paramètre Instrument (utiliser le type hint : Instrument $instrument)
// - Retourne le résultat de l'appel à play() sur l'instrument
// TODO: Créer une Guitar avec $guitarName et un Drum avec $drumName
// TODO: Passer chacun à performWith() et afficher les résultats (guitare d'abord, puis batterie)
?>Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses et objetsLe mot-clé $thisMéthodesPropriétésConstructeur (__construct)Destructeur (__destruct)Récapitulatif - Calculatrice simple4Héritage
Héritage de baseLe mot-clé parent::Redéfinition des méthodesLe mot-clé finalClasses abstraitesRécapitulatif – Hiérarchie des employés7Encapsulation
Public, Protected, PrivateModificateurs d’accès en profondeurAccesseurs et mutateursDissimulation de l’informationPromotion des constructeurs (8.0)Récapitulatif – Système de fiches étudiant10Concepts avancés de la POO
Composition ou héritageInjection de dépendancesClasses anonymesÉnumérations (PHP 8.1)Fibres (PHP 8.1)Approfondissement du clonage d’objetsGénérateurs et itérateurs13Patrons de conception – Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Méthode modèlePatron ÉtatPatron CompositePatron Dépôt2Espaces de noms et chargement automatique
Introduction aux espaces de nomsLe mot-clé useNorme de chargement automatique PSR-4Autoloader de ComposerRécapitulatif - Projet organisé5Interfaces et contrats
Introduction aux interfacesImplémentation des interfacesImplémentation de plusieurs interfacesInterface ou classe abstraiteIndication de type avec les interfacesRécapitulatif - Calculateur de formes8Méthodes magiques
Introduction aux méthodes magiques__toString et __debugInfo__get, __set, __isset, __unset__call et __callStatic__clone et clonage d’objets__serialize et __unserializeRécapitulatif - Collection personnalisée3Propriétés de classe
Propriétés d’instance vs statiquesConstantes dans les classesMéthodes et propriétés statiquesPropriétés privées et protégéesPropriétés en lecture seule (PHP 8.1)Récapitulatif - Gestionnaire de comptes bancaires6Polymorphisme
Révision de la redéfinition des méthodesPolymorphisme via les interfacesAnnotations de type et types unionLiaison statique tardiveRécapitulatif - Processeur de paiements9Traits
Introduction aux traitsUtilisation de plusieurs traitsRésolution des conflits entre traitsMéthodes abstraites dans les traitsTraits par rapport à l’héritage12Patrons de conception – Partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FactoryPatron ObserverPatron StrategyEntraînez-vous par vous-même : Compilateur PHP en ligne