Implementowanie interfejsów
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 28 z 91.
Skoro wiesz już, czym są interfejsy, zobaczmy, jak je zaimplementować. Klasa implementuje interfejs za pomocą słowa kluczowego implements i musi dostarczyć konkretne implementacje wszystkich metod zadeklarowanych w tym interfejsie.
<?php
interface Printable {
public function print();
}
class Document implements Printable {
private $content;
public function __construct($content) {
$this->content = $content;
}
public function print() {
return "Printing: " . $this->content;
}
}
$doc = new Document("Hello World");
echo $doc->print();
Wynik:
Printing: Hello WorldKlasa Document implementuje Printable, udostępniając własną wersję metody print(). Jeśli zapomnisz zaimplementować wymaganą metodę, PHP zgłosi błąd krytyczny.
Różne klasy mogą implementować ten sam interfejs na swój sposób:
<?php
class Invoice implements Printable {
private $amount;
public function __construct($amount) {
$this->amount = $amount;
}
public function print() {
return "Invoice Total: $" . $this->amount;
}
}
$invoice = new Invoice(150);
echo $invoice->print();
Wynik:
Invoice Total: $150Zarówno Document, jak i Invoice spełniają kontrakt Printable, ale każdy z nich obsługuje drukowanie inaczej, w zależności od swojego przeznaczenia.
Kluczowa kwestia: Użyj implements, aby powiązać klasę z interfejsem, a następnie zdefiniuj wszystkie wymagane metody. Każda implementująca klasa dostarcza własną logikę, gwarantując jednocześnie, że istnieją te same sygnatury metod.
Wyzwanie
ŁatwyZbudujmy system wiadomości, który pokazuje, jak różne klasy mogą implementować ten sam interfejs na własne, unikalne sposoby.
Utworzysz trzy pliki, które będą współpracować przy obsłudze różnych typów wiadomości:
Messageable.php: Zdefiniuj interfejsMessageablez dwiema sygnaturami metod:compose($content)ideliver(). Ten interfejs określa kontrakt, którego muszą przestrzegać wszystkie typy wiadomości.Email.php: Utwórz klasęEmail, która implementujeMessageable. Na początku dołącz plik interfejsu. Klasa powinna mieć prywatną właściwość$recipienti prywatną właściwość$body. Konstruktor przyjmuje adres odbiorcy. Zaimplementujcompose($content), aby zapisać treść w$bodyi zwrócić"Email composed". Zaimplementujdeliver(), aby zwracać"Email to [recipient]: [body]".SMS.php: Utwórz klasęSMS, która również implementujeMessageable. Na początku dołącz plik interfejsu. Klasa powinna mieć prywatną właściwość$phoneNumberi prywatną właściwość$text. Konstruktor przyjmuje numer telefonu. Zaimplementujcompose($content), aby zapisać treść w$texti zwrócić"SMS composed". Zaimplementujdeliver(), aby zwracać"SMS to [phoneNumber]: [text]".
W pliku main.php dołącz pliki Email i SMS. Otrzymasz trzy dane wejściowe: adres e-mail, numer telefonu i treść wiadomości. Utwórz obiekt Email z adresem e-mail oraz obiekt SMS z numerem telefonu. Wywołaj compose() z treścią wiadomości na obu obiektach, wyświetlając każdy wynik w osobnym wierszu. Następnie wywołaj deliver() na obu obiektach, wyświetlając każdy wynik w osobnym wierszu. Kolejność powinna być następująca: tworzenie wiadomości e-mail, tworzenie SMS-a, dostarczenie wiadomości e-mail, dostarczenie SMS-a.
Obie klasy spełniają ten sam kontrakt Messageable, ale każda obsługuje tworzenie i dostarczanie wiadomości zgodnie ze swoim przeznaczeniem: wiadomości e-mail pokazują adres odbiorcy, a wiadomości SMS — numer telefonu.
Spróbuj swoich sił
<?php
require_once 'Email.php';
require_once 'SMS.php';
// Odczytaj dane wejściowe
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));
// TODO: Utwórz obiekt Email z adresem e-mail
// TODO: Utwórz obiekt SMS z numerem telefonu
// TODO: Wywołaj compose() na obu obiektach i wypisz wyniki
// Kolejność: compose dla email, następnie compose dla SMS
// TODO: Wywołaj deliver() na obu obiektach i wypisz wyniki
// Kolejność: deliver dla email, następnie deliver dla SMS
?>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