Menu
Coddy logo textTech

Przesłanianie metod

Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 23 z 91.

Czasami odziedziczona metoda z klasy nadrzędnej nie do końca odpowiada potrzebom klasy potomnej. Nadpisywanie metod pozwala klasie potomnej udostępnić własną implementację metody, która już istnieje w klasie nadrzędnej.

Aby przesłonić metodę, po prostu zdefiniuj metodę w klasie potomnej o tej samej nazwie co metoda klasy nadrzędnej:

<?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();

Wynik:

Whiskers says meow

Klasa Cat całkowicie zastępuje metodę speak() klasy nadrzędnej własną wersją. Gdy wywołujesz speak() na obiekcie kota, PHP używa implementacji klasy potomnej.

Możesz również rozszerzyć działanie klasy nadrzędnej, łącząc parent:: z własną logiką:

<?php
class Dog extends Animal {
    public function speak() {
        return parent::speak() . " - woof woof!";
    }
}

$dog = new Dog("Rex");
echo $dog->speak();

Wynik:

Rex makes a sound - woof woof!

Kluczowa kwestia: Nadpisywanie metod pozwala klasom potomnym dostosować odziedziczone zachowanie. Możesz całkowicie zastąpić metodę lub użyć parent::, aby rozbudować pierwotną implementację.

challenge icon

Wyzwanie

Łatwy

Stwórzmy system powiadomień, który pokazuje, jak klasy potomne mogą całkowicie zastępować lub rozszerzać metody klas nadrzędnych poprzez nadpisywanie metod.

Utworzysz trzy współpracujące ze sobą pliki, które będą wysyłać różne rodzaje powiadomień, każde z własnym zachowaniem:

  • Notification.php: Zdefiniuj klasę Notification, która będzie klasą bazową dla wszystkich typów powiadomień. Powinna mieć publiczną właściwość $recipient oraz konstruktor, który przyjmuje i ustawia odbiorcę. Dodaj metodę send($message), która zwraca "Sending to [recipient]: [message]".
  • UrgentNotification.php: Zdefiniuj klasę UrgentNotification, która rozszerza Notification. Na początku dołącz plik Notification. Ta klasa powinna całkowicie nadpisywać metodę send($message), aby zwracała "URGENT to [recipient]: [message]!!!": zwróć uwagę na prefiks "URGENT" i wykrzykniki na końcu. To pokazuje całkowite zastąpienie zachowania klasy nadrzędnej.
  • LoggedNotification.php: Zdefiniuj klasę LoggedNotification, która rozszerza Notification. Na początku dołącz plik Notification. Ta klasa powinna nadpisywać metodę send($message), ale bazować na implementacji klasy nadrzędnej: wywołaj parent::send($message) i dołącz " [logged]" do wyniku. To pokazuje rozszerzanie zachowania zamiast jego zastępowania.

W pliku main.php dołącz wszystkie trzy pliki z klasami powiadomień. Otrzymasz dwa dane wejściowe: imię odbiorcy i wiadomość do wysłania. Utwórz jedną instancję każdego typu powiadomienia (wszystkie z tym samym odbiorcą), a następnie wywołaj send() z wiadomością dla każdej z nich. Wypisz każdy wynik w osobnym wierszu, w tej kolejności: zwykłe powiadomienie, pilne powiadomienie, a następnie powiadomienie z logowaniem.

To wyzwanie pokazuje dwa podejścia do nadpisywania metod: UrgentNotification całkowicie zastępuje logikę klasy nadrzędnej własnym formatowaniem, podczas gdy LoggedNotification używa parent::, aby zachować oryginalne zachowanie i je rozszerzyć.

Spróbuj swoich sił

<?php

require_once 'Notification.php';
require_once 'UrgentNotification.php';
require_once 'LoggedNotification.php';

// Wczytaj dane wejściowe
$recipient = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Utwórz po jednej instancji każdego typu powiadomienia (wszystkie z tym samym odbiorcą)

// TODO: Wywołaj send() z wiadomością dla każdego powiadomienia
// Wypisz każdy wynik w osobnym wierszu w tej kolejności:
// 1. Zwykłe powiadomienie
// 2. Pilne powiadomienie
// 3. Powiadomienie z zapisem w dzienniku

?>
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator PHP online