Mehrfache Interface-Implementierung
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 29 von 91.
Im Gegensatz zur Vererbung, bei der eine Klasse nur eine Basisklasse erweitern kann, erlaubt PHP einer Klasse, mehrere Interfaces zu implementieren. Dies gibt Ihnen die Flexibilität, verschiedene Verträge zu kombinieren, was Ihre Klassen vielseitiger macht.
Um mehrere Interfaces zu implementieren, trennen Sie diese durch Kommas nach dem implements-Schlüsselwort:
<?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 von Printable und Savable implementiert. Sie müssen Implementierungen für jede Methode bereitstellen, die in jedem Interface deklariert ist.
Dieser Ansatz ist leistungsstark, da er es Ihnen ermöglicht, Klassen zu erstellen, die mehrere Anforderungen erfüllen, ohne die Einschränkungen der Einzelvererbung. Eine Klasse kann gleichzeitig druckbar, speicherbar, exportierbar und vieles mehr sein.
Wichtiger Punkt: Verwenden Sie Kommas, um mehrere Interfaces zu implementieren. Ihre Klasse muss konkrete Implementierungen für alle Methoden von jedem Interface bereitstellen, das sie implementiert.
Aufgabe
EinfachLassen Sie uns ein Mediendateisystem aufbauen, das demonstriert, wie eine einzelne Klasse mehrere Interfaces implementieren kann, um verschiedene Fähigkeiten zu erlangen.
Sie werden vier Dateien erstellen, die zusammenarbeiten, um Mediendateien zu verarbeiten, die sowohl abgespielt als auch geteilt werden können:
Playable.php— Definieren Sie einPlayableInterface mit einer einzigen Methodensignatur:play(). Dieser Vertrag stellt sicher, dass jedes abspielbare Medium gestartet werden kann.Shareable.php— Definieren Sie einShareableInterface mit einer einzigen Methodensignatur:share($platform). Dieser Vertrag stellt sicher, dass jeder teilbare Inhalt auf verschiedenen Plattformen verbreitet werden kann.Video.php— Erstellen Sie eineVideoKlasse, die sowohlPlayableals auchShareableimplementiert. Binden Sie beide Interface-Dateien oben ein. Die Klasse sollte eine private$titleEigenschaft und eine private$durationEigenschaft (in Minuten) haben. Der Konstruktor akzeptiert den Titel und die Dauer. Implementieren Sieplay(), um"Playing video: [title] ([duration] min)"zurückzugeben. Implementieren Sieshare($platform), um"Sharing [title] on [platform]"zurückzugeben.main.php— Binden Sie die Video-Datei ein. Sie erhalten drei Eingaben: den Videotitel, die Dauer (als String, der in einen Integer umgewandelt werden muss) und einen Plattformnamen. Erstellen Sie einVideoObjekt mit dem Titel und der Dauer. Geben Sie das Ergebnis des Aufrufs vonplay()in der ersten Zeile aus und geben Sie dann das Ergebnis des Aufrufs vonshare()mit der Plattform in der zweiten Zeile aus.
Ihre Video Klasse erfüllt zwei separate Verträge gleichzeitig — sie kann wie jedes Medium abgespielt werden und sie kann auf sozialen Plattformen geteilt werden. Dies ist die Stärke der Implementierung mehrerer Interfaces: Eine einzelne Klasse erhält Fähigkeiten aus verschiedenen Quellen, ohne auf eine einzige Vererbungskette beschränkt zu sein.
Spickzettel
Eine Klasse kann mehrere Interfaces implementieren, indem sie diese nach dem Schlüsselwort implements durch Kommas trennt:
<?php
interface Printable {
public function print();
}
interface Savable {
public function save();
}
class Report implements Printable, Savable {
public function print() {
return "Printing report";
}
public function save() {
return "Saving report";
}
}Die Klasse muss konkrete Implementierungen für alle Methoden aus jedem Interface bereitstellen, das sie implementiert. Dies ermöglicht es einer Klasse, mehrere Verträge gleichzeitig zu erfüllen, ohne die Einschränkungen der Einzelvererbung.
Probier es selbst
<?php
// Binde die Video-Datei ein
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 die OOPKlassen vs. ObjekteDas $this-SchlüsselwortMethodenEigenschaftenKonstruktor (__construct)Destruktor (__destruct)Rückblick - Einfacher Taschenrechner4Vererbung
Grundlagen der VererbungDas parent:: SchlüsselwortMethoden überschreibenDas final SchlüsselwortAbstrakte KlassenZusammenfassung – Mitarbeiter-Hierarchie7Kapselung
Public, Protected, PrivateZugriffsmodifikatoren im DetailGetter und SetterInformation HidingConstructor Promotion (8.0)Zusammenfassung – Studentenverwaltungssystem2Namensräume & Autoloading
Einführung in NamensräumeDas use-SchlüsselwortPSR-4 Autoloading-StandardComposer AutoloaderZusammenfassung – Organisiertes Projekt5Interfaces & Verträge
Einführung in InterfacesInterfaces implementierenMehrfache Interface-ImplementierungInterface vs. Abstrakte KlasseType Hinting mit InterfacesZusammenfassung – Formen-Rechner8Magische Methoden
Einführung in magische Methoden__toString & __debugInfo__get, __set, __isset, __unset__call & __callStatic__clone & Objekt-Klonen__serialize & __unserializeZusammenfassung - Eigene Collection11Typsystem & Fehlerbehandlung
TypdeklarationenNullable-TypenUnion- & Intersection-TypenException-KlassenEigene Exception-HierarchieTry, Catch, FinallyZusammenfassung - Formular-Validator14Projekt: Bibliotheksverwaltung
ProjektübersichtBuch- und Benutzerklassen3Klasseneigenschaften
Instanz- vs. statische EigenschaftenKonstanten in KlassenStatische Methoden & EigenschaftenPrivate & geschützte EigenschaftenReadonly-Eigenschaften (PHP 8.1)Zusammenfassung – Bankkonto-Manager6Polymorphismus
Method Overriding erneut betrachtetPolymorphismus über InterfacesType Hinting & Union TypesLate Static BindingZusammenfassung – Payment Processor9Traits
Einführung in TraitsVerwendung mehrerer TraitsKonfliktlösung bei TraitsAbstrakte Methoden in TraitsTraits vs. Vererbung12Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterObserver-MusterStrategy-Muster15Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung