Wprowadzenie do interfejsów
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 27 z 91.
Interfejs definiuje kontrakt, którego muszą przestrzegać klasy. W przeciwieństwie do klas abstrakcyjnych, które mogą zawierać zarówno metody abstrakcyjne, jak i konkretne, interfejs jedynie deklaruje sygnatury metod bez ich implementacji. Pomyśl o nim jak o obietnicy: każda klasa implementująca interfejs gwarantuje, że udostępni określone metody.
Definiujesz interfejs za pomocą słowa kluczowego interface:
<?php
interface Printable {
public function print();
}
Ten interfejs deklaruje, że każda klasa implementująca Printable musi mieć metodę print(). Interfejs nie dba o to, jak działa ta metoda, a jedynie o to, by istniała.
Oto prosty przykład pokazujący podstawową strukturę:
<?php
interface Drivable {
public function start();
public function stop();
}
Zwróć uwagę, że metody interfejsu nie mają treści, a jedynie sygnaturę zakończoną średnikiem. Wszystkie metody w interfejsie są niejawnie publiczne, więc nie możesz używać private ani protected.
Interfejsy są potężne, ponieważ pozwalają niezwiązanym ze sobą klasom współdzielić wspólne zachowanie. Car i Motorcycle mogą nie mieć ze sobą nic wspólnego pod względem dziedziczenia, ale obie mogą implementować Drivable, aby zagwarantować, że mają metody start() i stop().
Najważniejsza kwestia: Interfejs definiuje, jakie metody musi mieć klasa, a nie jak powinny działać. Ustanawia kontrakt, który muszą spełniać klasy implementujące ten interfejs.
Wyzwanie
ŁatwyZbudujmy prosty system wiadomości, który wprowadzi Cię w interfejsy. Zdefiniujesz interfejs określający kontrakt dotyczący obsługi wiadomości, tworząc podstawę dla klas implementujących, które utworzysz w następnej lekcji.
Rozmieścisz kod w dwóch plikach:
Messageable.php: Zdefiniuj interfejs o nazwieMessageable, który deklaruje sygnatury dwóch metod:compose($content)do tworzenia wiadomości orazdeliver()do jej wysyłania. Pamiętaj, że metody interfejsu nie mają ciała — zawierają tylko sygnaturę zakończoną średnikiem.main.php: Dołącz plik Messageable. Aby sprawdzić, czy interfejs jest poprawnie zdefiniowany, użyj funkcji PHPinterface_exists(), by sprawdzić, czy istniejeMessageable. Następnie użyjReflectionClass, aby sprawdzić interfejs i wyświetlić jego metody. Utwórz obiekt refleksji interfejsu, pobierz jego metody za pomocągetMethods()(która zwraca obiektyReflectionMethod) i wyświetl nazwę każdej metody za pomocągetName(), każdą w osobnym wierszu.
Wynik powinien wyświetlać nazwy dwóch metod zadeklarowanych w interfejsie, każdą w osobnym wierszu, w kolejności, w jakiej je zdefiniowano.
To wyzwanie skupia się wyłącznie na definiowaniu interfejsu: kontraktu, który będą musiały spełniać przyszłe klasy. Określasz, jakie metody muszą istnieć, nie martwiąc się o to, jak będą działać. Implementacją zajmiesz się w następnej lekcji!
Spróbuj swoich sił
<?php
// Dołącz plik interfejsu Messageable
require_once 'Messageable.php';
// TODO: Użyj interface_exists(), aby sprawdzić, czy interfejs Messageable istnieje
// TODO: Utwórz obiekt ReflectionClass dla interfejsu Messageable
// TODO: Pobierz metody za pomocą getMethods()
// TODO: Przejdź przez metody i wypisz nazwę każdej z nich w osobnym wierszu
?>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