Podstawy dziedziczenia
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 21 z 91.
Dziedziczenie pozwala klasie przejąć właściwości i metody z innej klasy. Zamiast ponownie pisać ten sam kod, możesz utworzyć klasę bazową ze wspólnymi funkcjonalnościami, a inne klasy mogą po niej dziedziczyć.
Klasę, po której dziedziczy się, nazywa się klasą nadrzędną (lub klasą bazową), a klasę, która dziedziczy, nazywa się klasą podrzędną. Użyj słowa kluczowego extends, aby ustanowić tę relację:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
public function speak() {
return "$this->name makes a sound";
}
}
class Dog extends Animal {
public function fetch() {
return "$this->name fetches the ball";
}
}
$dog = new Dog("Buddy");
echo $dog->speak() . "\n";
echo $dog->fetch();
Wynik:
Buddy makes a sound
Buddy fetches the ballKlasa Dog automatycznie uzyskuje dostęp do właściwości $name, konstruktora i metody speak() klasy Animal. Definiuje też własną metodę fetch(), którą mają tylko psy.
Tworzy to jasną hierarchię: każdy pies jest zwierzęciem, więc ma sens, aby Dog dziedziczyła po Animal. Klasa potomna może korzystać ze wszystkiego, co oferuje klasa nadrzędna, a jednocześnie dodawać własne, wyspecjalizowane zachowanie.
Najważniejsze: Dziedziczenie sprzyja ponownemu wykorzystywaniu kodu i ustanawia logiczne relacje między klasami. Klasa potomna dziedziczy wszystkie publiczne i chronione składowe klasy nadrzędnej, co ogranicza powielanie i ułatwia utrzymanie kodu.
Wyzwanie
ŁatwyStwórzmy hierarchię pojazdów, która pokazuje, jak dziedziczenie pozwala klasom potomnym współdzielić funkcjonalność klasy nadrzędnej i dodawać własne, specjalistyczne zachowania.
Rozmieścisz swój kod w trzech plikach:
Vehicle.php: Zdefiniuj klasęVehicle, która będzie klasą nadrzędną dla wszystkich pojazdów. Powinna mieć publiczną właściwość$brandoraz konstruktor, który przyjmuje i ustawia markę. Dodaj metodęstart(), która zwraca"[brand] is starting", oraz metodęstop(), która zwraca"[brand] is stopping".Motorcycle.php: Zdefiniuj klasęMotorcycle, która rozszerza klasęVehicle. Na początku dołącz plik Vehicle. Klasa Motorcycle nie potrzebuje własnego konstruktora, ponieważ odziedziczy konstruktor klasy nadrzędnej. Dodaj metodęwheelie(), która zwraca"[brand] is doing a wheelie!". To zachowanie charakterystyczne dla motocykli.main.php: Dołącz plik Motorcycle (który już dołącza Vehicle). Otrzymasz jedno wejście: markę motocykla. Utwórz obiektMotorcycletej marki. Wypisz wynik wywołania kolejno metodstart(),wheelie()istop(), każdą w osobnym wierszu.
Zauważ, jak klasa Motorcycle automatycznie dziedziczy z klasy Vehicle właściwość $brand, konstruktor oraz obie metody start() i stop(). Klasa potomna musi zdefiniować tylko to, co ją wyróżnia — w tym przypadku możliwość wykonywania wheelie. Na tym polega siła dziedziczenia: napisz wspólną funkcjonalność raz w klasie nadrzędnej i pozwól klasom potomnym z niej korzystać oraz dodawać własne specjalizacje.
Spróbuj swoich sił
<?php
// Dołącz klasę Motorcycle (która już zawiera Vehicle)
require_once 'Motorcycle.php';
// Odczytaj dane wejściowe
$brand = trim(fgets(STDIN));
// TODO: Utwórz obiekt Motorcycle z podaną marką
// TODO: Wypisz wynik start()
// TODO: Wypisz wynik wheelie()
// TODO: Wypisz wynik stop()
?>Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe $thisMetodyWłaściwościKonstruktor (__construct)Destruktor (__destruct)Powtórka — prosty kalkulator4Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe parent::Przesłanianie metodSłowo kluczowe finalKlasy abstrakcyjnePowtórzenie – hierarchia pracowników7Enkapsulacja
Public, protected, privateModyfikatory dostępu w szczegółachGettery i setteryUkrywanie informacjiPromocja parametrów konstruktora (8.0)Podsumowanie — system ewidencji studentów2Przestrzenie nazw i autoloading
Wprowadzenie do przestrzeni nazwSłowo kluczowe useStandard autoloadingu PSR-4Autoloader ComposeraPodsumowanie – uporządkowany projekt5Interfejsy i kontrakty
Wprowadzenie do interfejsówImplementowanie interfejsówImplementowanie wielu interfejsówInterfejs a klasa abstrakcyjnaPodpowiadanie typów za pomocą interfejsówPodsumowanie — kalkulator kształtów8Metody magiczne
Wprowadzenie do metod magicznych__toString i __debugInfo__get, __set, __isset, __unset__call i __callStatic__clone i klonowanie obiektów__serialize i __unserializePodsumowanie — własna kolekcja11System typów i obsługa błędów
Deklaracje typówTypy nullableTypy sumy i przecięciaKlasy wyjątkówNiestandardowa hierarchia wyjątkówTry, Catch, FinallyPodsumowanie — walidator formularzy14Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Właściwości klas
Właściwości instancji a właściwości statyczneStałe w klasachMetody i właściwości statyczneWłaściwości prywatne i chronioneWłaściwości tylko do odczytu (PHP 8.1)Podsumowanie — menedżer kont bankowych6Polimorfizm
Ponowne omówienie nadpisywania metodPolimorfizm za pomocą interfejsówPodpowiedzi typów i typy sumyPóźne wiązanie statycznePodsumowanie — procesor płatności9Cechy
Wprowadzenie do cechKorzystanie z wielu cechRozwiązywanie konfliktów cechMetody abstrakcyjne w cechachCechy a dziedziczenie12Wzorce projektowe, część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator PHP online