Słowo kluczowe parent::
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 22 z 91.
Gdy klasa potomna dziedziczy po klasie nadrzędnej, czasami trzeba uzyskać bezpośredni dostęp do metod lub właściwości klasy nadrzędnej. Słowo kluczowe parent:: pozwala wywołać implementację klasy nadrzędnej z wnętrza klasy potomnej.
Jest to szczególnie przydatne w konstruktorach, gdy klasa potomna musi zainicjalizować właściwości klasy nadrzędnej, a jednocześnie ustawić własne:
<?php
class Animal {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
class Dog extends Animal {
public $breed;
public function __construct($name, $breed) {
parent::__construct($name);
$this->breed = $breed;
}
public function describe() {
return "$this->name is a $this->breed";
}
}
$dog = new Dog("Max", "Labrador");
echo $dog->describe();
Wynik:
Max is a LabradorWywołując parent::__construct($name), klasa potomna ponownie wykorzystuje logikę inicjalizacji klasy nadrzędnej zamiast ją powielać. Bez tego wywołania właściwość $name nigdy nie zostałaby ustawiona.
Możesz użyć parent::, aby wywołać dowolną metodę klasy nadrzędnej, nie tylko konstruktory. Jest to szczególnie ważne, gdy chcesz rozszerzyć działanie metody, zamiast całkowicie ją zastępować.
Najważniejsza kwestia: Słowo kluczowe parent:: umożliwia dostęp do implementacji klasy nadrzędnej. Jest niezbędne do prawidłowego łańcuchowego wywoływania konstruktorów oraz do rozwijania odziedziczonej funkcjonalności zamiast jej przepisywania.
Wyzwanie
ŁatwyZbudujmy system katalogu produktów, który pokazuje, jak klasy potomne mogą rozszerzać funkcjonalność klas nadrzędnych za pomocą słowa kluczowego parent::, aby poprawnie łączyć konstruktory i rozwijać odziedziczone metody.
Rozmieścisz swój kod w trzech plikach:
Product.php: Zdefiniuj klasęProduct, która będzie klasą bazową dla wszystkich produktów. Powinna mieć publiczne właściwości$namei$price. Konstruktor przyjmuje nazwę i cenę, ustawiając obie właściwości. Dodaj metodęgetDetails(), która zwraca"[name]: $[price]".ElectronicProduct.php: Zdefiniuj klasęElectronicProduct, która rozszerza klasęProduct. Na początku pliku dołącz plik Product. Ta klasa dodaje właściwość$warranty(w miesiącach). Konstruktor powinien przyjmować nazwę, cenę i okres gwarancji: użyjparent::__construct(), aby zainicjalizować nazwę i cenę za pomocą konstruktora klasy nadrzędnej, a następnie samodzielnie ustaw okres gwarancji. Utwórz metodęgetDetails(), która rozwija implementację klasy nadrzędnej: wywołajparent::getDetails()i dopisz do wyniku" (Warranty: [warranty] months)".main.php: Dołącz plik ElectronicProduct. Otrzymasz trzy dane wejściowe: nazwę produktu, cenę (jako ciąg znaków do przekonwertowania na liczbę zmiennoprzecinkową) oraz okres gwarancji (jako ciąg znaków do przekonwertowania na liczbę całkowitą). Utwórz obiektElectronicProductz tymi wartościami i wypisz wynik wywołaniagetDetails().
To wyzwanie pokazuje prawdziwą moc parent::. Nie tylko przy łączeniu konstruktorów, ale również przy rozszerzaniu działania metod. Klasa ElectronicProduct ponownie wykorzystuje logikę formatowania klasy nadrzędnej i dodaje do niej własne szczegóły, unikając powielania kodu i tworząc bogatszy wynik.
Spróbuj swoich sił
<?php
require_once 'ElectronicProduct.php';
// Odczytaj dane wejściowe
$name = trim(fgets(STDIN));
$price = floatval(trim(fgets(STDIN)));
$warranty = intval(trim(fgets(STDIN)));
// TODO: Utwórz obiekt ElectronicProduct z wartościami wejściowymi
// i wypisz wynik wywołania getDetails()
?>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