Menu
Coddy logo textTech

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 meow

La 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.

challenge icon

Défi

Facile

Construisons 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 classe Notification qui sert de base à tous les types de notifications. Elle doit avoir une propriété publique $recipient et un constructeur qui accepte et définit le destinataire. Incluez une méthode send($message) qui renvoie "Sending to [recipient]: [message]".
  • UrgentNotification.php : définissez une classe UrgentNotification qui étend Notification. Incluez le fichier Notification au début. Cette classe doit complètement redéfinir la méthode send($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 classe LoggedNotification qui étend Notification. Incluez le fichier Notification au début. Cette classe doit redéfinir send($message), tout en s’appuyant sur l’implémentation de la classe parente : appelez parent::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

?>
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur PHP en ligne