Implementowanie wielu interfejsów
Część sekcji Programowanie obiektowe ścieżki PHP w Coddy. Lekcja 29 z 91.
W przeciwieństwie do dziedziczenia, w którym klasa może rozszerzać tylko jedną klasę nadrzędną, PHP pozwala klasie implementować wiele interfejsów. Daje ci to elastyczność w łączeniu różnych kontraktów, dzięki czemu twoje klasy są bardziej wszechstronne.
Aby zaimplementować wiele interfejsów, oddziel je przecinkami po słowie kluczowym implements:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
private $title;
public function __construct($title) {
$this->title = $title;
}
public function print() {
return "Printing: " . $this->title;
}
public function save() {
return "Saving: " . $this->title;
}
}
$report = new Report("Sales Report");
echo $report->print() . "\n";
echo $report->save();
Wynik:
Printing: Sales Report
Saving: Sales ReportKlasa Report spełnia oba kontrakty, implementując wszystkie metody z interfejsów Printable i Savable. Musisz dostarczyć implementacje wszystkich metod zadeklarowanych w każdym interfejsie.
To podejście jest potężne, ponieważ pozwala tworzyć klasy, które spełniają wiele wymagań bez ograniczeń związanych z dziedziczeniem pojedynczym. Klasa może być jednocześnie przeznaczona do drukowania, zapisywania, eksportowania i wielu innych rzeczy.
Najważniejsze: Używaj przecinków, aby implementować wiele interfejsów. Twoja klasa musi zawierać konkretne implementacje wszystkich metod z każdego interfejsu, który implementuje.
Wyzwanie
ŁatwyZbudujmy system plików multimedialnych, który pokazuje, jak jedna klasa może implementować wiele interfejsów, aby zyskać różne możliwości.
Utworzysz cztery współpracujące ze sobą pliki do obsługi plików multimedialnych, które można zarówno odtwarzać, jak i udostępniać:
Playable.php: Zdefiniuj interfejsPlayablez jedną sygnaturą metody:play(). Ten kontrakt zapewnia, że każde odtwarzalne medium można uruchomić.Shareable.php: Zdefiniuj interfejsShareablez jedną sygnaturą metody:share($platform). Ten kontrakt zapewnia, że każdą treść, którą można udostępniać, można rozpowszechniać na różnych platformach.Video.php: Utwórz klasęVideo, która implementuje zarównoPlayable, jak iShareable. Na początku dołącz oba pliki interfejsów. Klasa powinna mieć prywatną właściwość$titlei prywatną właściwość$duration(w minutach). Konstruktor przyjmuje tytuł i czas trwania. Zaimplementujplay(), aby zwracała"Playing video: [title] ([duration] min)". Zaimplementujshare($platform), aby zwracała"Sharing [title] on [platform]".main.php: Dołącz plik Video. Otrzymasz trzy dane wejściowe: tytuł filmu, czas trwania (jako ciąg znaków do przekonwertowania na liczbę całkowitą) oraz nazwę platformy. Utwórz obiektVideoz tytułem i czasem trwania. Wypisz wynik wywołaniaplay()w pierwszym wierszu, a następnie wypisz wynik wywołaniashare()z platformą w drugim wierszu.
Twoja klasa Video jednocześnie spełnia dwa odrębne kontrakty. Można ją odtwarzać tak jak dowolne medium, a także udostępniać na platformach społecznościowych. Na tym polega siła implementowania wielu interfejsów: jedna klasa zyskuje możliwości z różnych źródeł, nie ograniczając się do pojedynczego łańcucha dziedziczenia.
Spróbuj swoich sił
<?php
// Dołącz plik Video
require_once 'Video.php';
// Odczytaj dane wejściowe
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: Utwórz obiekt Video z tytułem i czasem trwania
// TODO: Wypisz w pierwszym wierszu wynik wywołania play()
// TODO: Wypisz w drugim wierszu wynik wywołania share() z platformą
?>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