Menu
Coddy logo textTech

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 ball

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

challenge icon

Wyzwanie

Łatwy

Stwó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ść $brand oraz 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 obiekt Motorcycle tej marki. Wypisz wynik wywołania kolejno metod start(), wheelie() i stop(), 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()
?>
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