Interfaces implementieren
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy — Lektion 28 von 91.
Nachdem Sie nun verstanden haben, was Interfaces sind, schauen wir uns an, wie man sie tatsächlich implementiert. Eine Klasse implementiert ein Interface unter Verwendung des Schlüsselworts implements und muss konkrete Implementierungen für alle in diesem Interface deklarierten Methoden bereitstellen.
<?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();
Ausgabe:
Printing: Hello WorldDie Klasse Document implementiert Printable, indem sie ihre eigene Version der Methode print() bereitstellt. Wenn Sie vergessen, eine erforderliche Methode zu implementieren, wird PHP einen fatalen Fehler auslösen.
Verschiedene Klassen können dasselbe Interface auf ihre eigene Weise implementieren:
<?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();
Ausgabe:
Invoice Total: $150Sowohl Document als auch Invoice erfüllen den Printable-Vertrag, aber jedes verarbeitet das Drucken je nach Verwendungszweck unterschiedlich.
Wichtiger Punkt: Verwenden Sie implements, um eine Klasse mit einem Interface zu verbinden, und definieren Sie dann alle erforderlichen Methoden. Jede implementierende Klasse bietet ihre eigene Logik, während sie garantiert, dass dieselben Methodensignaturen existieren.
Aufgabe
EinfachLassen Sie uns ein Nachrichtensystem bauen, das demonstriert, wie verschiedene Klassen dasselbe Interface auf ihre eigene, einzigartige Weise implementieren können.
Sie werden drei Dateien erstellen, die zusammenarbeiten, um verschiedene Arten von Nachrichten zu verarbeiten:
Messageable.php— Definieren Sie dasMessageable-Interface mit zwei Methodensignaturen:compose($content)unddeliver(). Dieses Interface legt den Vertrag fest, dem alle Nachrichtentypen folgen müssen.Email.php— Erstellen Sie eineEmail-Klasse, dieMessageableimplementiert. Binden Sie die Interface-Datei am Anfang ein. Die Klasse sollte eine private$recipient-Eigenschaft und eine private$body-Eigenschaft haben. Der Konstruktor akzeptiert die Empfängeradresse. Implementieren Siecompose($content), um den Inhalt in$bodyzu speichern und"Email composed"zurückzugeben. Implementieren Siedeliver(), um"Email to [recipient]: [body]"zurückzugeben.SMS.php— Erstellen Sie eineSMS-Klasse, die ebenfallsMessageableimplementiert. Binden Sie die Interface-Datei am Anfang ein. Die Klasse sollte eine private$phoneNumber-Eigenschaft und eine private$text-Eigenschaft haben. Der Konstruktor akzeptiert die Telefonnummer. Implementieren Siecompose($content), um den Inhalt in$textzu speichern und"SMS composed"zurückzugeben. Implementieren Siedeliver(), um"SMS to [phoneNumber]: [text]"zurückzugeben.
In main.php binden Sie sowohl die Email- als auch die SMS-Dateien ein. Sie erhalten drei Eingaben: eine E-Mail-Adresse, eine Telefonnummer und einen Nachrichtentext. Erstellen Sie ein Email-Objekt mit der E-Mail-Adresse und ein SMS-Objekt mit der Telefonnummer. Rufen Sie compose() mit dem Nachrichtentext für beide Objekte auf und geben Sie jedes Ergebnis in einer eigenen Zeile aus. Rufen Sie dann deliver() für beide Objekte auf und geben Sie jedes Ergebnis in einer eigenen Zeile aus. Die Reihenfolge sollte sein: Email compose, SMS compose, Email deliver, SMS deliver.
Beide Klassen erfüllen denselben Messageable-Vertrag, aber jede verarbeitet das Erstellen und Zustellen von Nachrichten gemäß ihrem eigenen Zweck — E-Mails zeigen die Empfängeradresse, während SMS-Nachrichten die Telefonnummer zeigen.
Spickzettel
Eine Klasse implementiert ein Interface unter Verwendung des Schlüsselworts implements und muss konkrete Implementierungen für alle in diesem Interface deklarierten Methoden bereitstellen:
<?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;
}
}
Mehrere Klassen können dasselbe Interface implementieren, wobei jede ihre eigene Implementierung bereitstellt:
<?php
class Invoice implements Printable {
private $amount;
public function __construct($amount) {
$this->amount = $amount;
}
public function print() {
return "Invoice Total: $" . $this->amount;
}
}
Wenn eine Klasse nicht alle erforderlichen Methoden eines Interfaces implementiert, wird PHP einen Fatal Error auslösen.
Probier es selbst
<?php
require_once 'Email.php';
require_once 'SMS.php';
// Eingaben lesen
$emailAddress = trim(fgets(STDIN));
$phoneNumber = trim(fgets(STDIN));
$messageContent = trim(fgets(STDIN));
// TODO: Erstellen Sie ein Email-Objekt mit der E-Mail-Adresse
// TODO: Erstellen Sie ein SMS-Objekt mit der Telefonnummer
// TODO: Rufen Sie compose() für beide Objekte auf und geben Sie die Ergebnisse aus
// Reihenfolge: Email compose, dann SMS compose
// TODO: Rufen Sie deliver() für beide Objekte auf und geben Sie die Ergebnisse aus
// Reihenfolge: Email deliver, dann SMS deliver
?>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