Mehrere Schnittstellen implementieren
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 29 von 91.
Im Gegensatz zur Vererbung, bei der eine Klasse nur eine übergeordnete Klasse erweitern kann, ermöglicht PHP einer Klasse, mehrere Schnittstellen zu implementieren. Dadurch kannst du verschiedene Verträge kombinieren und deine Klassen vielseitiger gestalten.
Um mehrere Schnittstellen zu implementieren, trenne sie nach dem Schlüsselwort implements durch Kommas:
<?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();
Ausgabe:
Printing: Sales Report
Saving: Sales ReportDie Klasse Report erfüllt beide Verträge, indem sie alle Methoden aus Printable und Savable implementiert. Du musst Implementierungen für jede in den einzelnen Schnittstellen deklarierte Methode bereitstellen.
Dieser Ansatz ist leistungsfähig, weil du damit Klassen erstellen kannst, die mehrere Anforderungen erfüllen, ohne den Einschränkungen der Einfachvererbung zu unterliegen. Eine Klasse kann gleichzeitig druckbar, speicherbar, exportierbar und vieles mehr sein.
Wichtiger Punkt: Verwende Kommas, um mehrere Schnittstellen zu implementieren. Deine Klasse muss konkrete Implementierungen für alle Methoden aus jeder Schnittstelle bereitstellen, die sie implementiert.
Aufgabe
EinfachErstellen wir ein Mediadateisystem, das veranschaulicht, wie eine einzelne Klasse mehrere Schnittstellen implementieren kann, um verschiedene Fähigkeiten zu erlangen.
Du wirst vier Dateien erstellen, die zusammenarbeiten, um Mediendateien zu verarbeiten, die sowohl abgespielt als auch geteilt werden können:
Playable.php: Definiere einePlayable-Schnittstelle mit einer einzigen Methodensignatur:play(). Dieser Vertrag stellt sicher, dass jedes abspielbare Medium gestartet werden kann.Shareable.php: Definiere eineShareable-Schnittstelle mit einer einzigen Methodensignatur:share($platform). Dieser Vertrag stellt sicher, dass alle teilbaren Inhalte auf verschiedenen Plattformen verbreitet werden können.Video.php: Erstelle eineVideo-Klasse, die sowohlPlayableals auchShareableimplementiert. Binde beide Schnittstellendateien am Anfang ein. Die Klasse sollte eine private$title-Eigenschaft und eine private$duration-Eigenschaft (in Minuten) besitzen. Der Konstruktor akzeptiert den Titel und die Dauer. Implementiereplay(), sodass"Playing video: [title] ([duration] min)"zurückgegeben wird. Implementiereshare($platform), sodass"Sharing [title] on [platform]"zurückgegeben wird.main.php: Binde die Datei Video ein. Du erhältst drei Eingaben: den Videotitel, die Dauer (als Zeichenfolge, die in eine Ganzzahl umgewandelt werden soll) und einen Plattformnamen. Erstelle einVideo-Objekt mit dem Titel und der Dauer. Gib das Ergebnis des Aufrufs vonplay()in der ersten Zeile aus und anschließend das Ergebnis des Aufrufs vonshare()mit der Plattform in der zweiten Zeile.
Deine Video-Klasse erfüllt gleichzeitig zwei separate Verträge. Sie kann wie jedes Medium abgespielt und auf sozialen Plattformen geteilt werden. Das ist die Stärke der Implementierung mehrerer Schnittstellen: Eine einzelne Klasse erhält Fähigkeiten aus verschiedenen Quellen, ohne auf eine einzige Vererbungskette beschränkt zu sein.
Probier es selbst
<?php
// Video-Datei einbinden
require_once 'Video.php';
// Eingaben lesen
$title = trim(fgets(STDIN));
$duration = intval(trim(fgets(STDIN)));
$platform = trim(fgets(STDIN));
// TODO: Erstelle ein Video-Objekt mit dem Titel und der Dauer
// TODO: Gib das Ergebnis des Aufrufs von play() in der ersten Zeile aus
// TODO: Gib das Ergebnis des Aufrufs von share() mit der Plattform in der zweiten Zeile aus
?>Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in OOPKlassen vs. ObjekteDas Schlüsselwort $thisMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick – Einfacher Taschenrechner4Vererbung
Grundlegende VererbungDas Schlüsselwort parent::MethodenüberschreibungDas Schlüsselwort finalAbstrakte KlassenRückblick – Mitarbeiterhierarchie7Kapselung
Öffentlich, geschützt, privatZugriffsmodifikatoren im DetailGetter und SetterInformationsverbergungKonstruktor-Promotion (8.0)Wiederholung – System zur Verwaltung von Schülerdatensätzen2Namespaces & Autoloading
Einführung in NamespacesDas use-SchlüsselwortPSR-4-Autoloading-StandardComposer-AutoloaderRückblick – Organisiertes Projekt5Schnittstellen & Verträge
Einführung in SchnittstellenSchnittstellen implementierenMehrere Schnittstellen implementierenSchnittstelle vs. abstrakte KlasseTyp-Hinweise mit SchnittstellenRückblick – Formrechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objektklonen__serialize & __unserializeRückblick – Benutzerdefinierte Sammlung11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenBenutzerdefinierte Exception-HierarchieTry, Catch, FinallyRückblick – Formularvalidator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klassen-Eigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenSchreibgeschützte Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphie
Methodenüberschreibung erneut betrachtetPolymorphie über SchnittstellenTyp-Hinweise & Union-TypenSpätes statisches BindenRückblick – Zahlungsabwickler9Traits
Einführung in TraitsMehrere Traits verwendenAuflösung von Trait-KonfliktenAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungÜbe selbstständig: Online-PHP-Compiler