Redéfinition des méthodes
Fait partie de la section Programmation Orientée Objet du Journey PHP de Coddy. Leçon 23 sur 91.
Parfois, la méthode héritée d’une classe parente ne correspond pas tout à fait aux besoins de la classe enfant. La redéfinition de méthode permet à une classe enfant de fournir sa propre implémentation d’une méthode qui existe déjà dans la classe parente.
Pour redéfinir une méthode, il suffit de définir une méthode dans la classe enfant portant le même nom que la méthode de la classe parente :
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Cat extends Animal {
public function speak() {
return "$this->name says meow";
}
}
$cat = new Cat("Whiskers");
echo $cat->speak();
Sortie :
Whiskers says meowLa classe Cat remplace complètement la méthode speak() du parent par sa propre version. Lorsque vous appelez speak() sur un objet chat, PHP utilise l’implémentation de l’enfant.
Vous pouvez également étendre le comportement du parent en combinant parent:: avec votre propre logique :
<?php
class Dog extends Animal {
public function speak() {
return parent::speak() . " - woof woof!";
}
}
$dog = new Dog("Rex");
echo $dog->speak();
Sortie :
Rex makes a sound - woof woof!Point clé : La redéfinition de méthode permet aux classes enfants de personnaliser le comportement hérité. Vous pouvez remplacer complètement une méthode ou utiliser parent:: pour vous appuyer sur l’implémentation d’origine.
Défi
FacileConstruisons un système de notifications qui montre comment les classes enfants peuvent remplacer complètement ou étendre les méthodes des classes parentes grâce à la redéfinition des méthodes.
Vous allez créer trois fichiers qui fonctionnent ensemble pour envoyer différents types de notifications, chacun ayant son propre comportement :
Notification.php: définissez une classeNotificationqui sert de base à tous les types de notifications. Elle doit avoir une propriété publique$recipientet un constructeur qui accepte et définit le destinataire. Incluez une méthodesend($message)qui renvoie"Sending to [recipient]: [message]".UrgentNotification.php: définissez une classeUrgentNotificationqui étendNotification. Incluez le fichier Notification au début. Cette classe doit complètement redéfinir la méthodesend($message)afin de renvoyer"URGENT to [recipient]: [message]!!!": remarquez le préfixe « URGENT » et les points d’exclamation à la fin. Cela démontre le remplacement complet du comportement de la classe parente.LoggedNotification.php: définissez une classeLoggedNotificationqui étendNotification. Incluez le fichier Notification au début. Cette classe doit redéfinirsend($message), tout en s’appuyant sur l’implémentation de la classe parente : appelezparent::send($message)et ajoutez" [logged]"au résultat. Cela démontre l’extension du comportement plutôt que son remplacement.
Dans main.php, incluez les trois fichiers de classes de notification. Vous recevrez deux entrées : le nom du destinataire et le message à envoyer. Créez une instance de chaque type de notification (toutes utilisant le même destinataire), puis appelez send() avec le message sur chacune d’elles. Affichez chaque résultat sur sa propre ligne, dans cet ordre : notification normale, notification urgente, puis notification enregistrée.
Ce défi montre les deux approches de la redéfinition des méthodes : UrgentNotification remplace complètement la logique de la classe parente par son propre formatage, tandis que LoggedNotification utilise parent:: pour conserver le comportement d’origine et lui ajouter un élément.
Essayez vous-même
<?php
require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';
// Lire l'entrée
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));
// TODO: Créer une instance de chaque type de notification (toutes utilisant le même destinataire)
// TODO: Appeler send() avec le message sur chaque notification
// Afficher chaque résultat sur sa propre ligne dans cet ordre :
// 1. Notification régulière
// 2. Notification urgente
// 3. Notification journalisée
?>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