Schnittstellen implementieren
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 28 von 91.
Nachdem du nun verstanden hast, was Schnittstellen sind, sehen wir uns an, wie man sie tatsächlich implementiert. Eine Klasse implementiert eine Schnittstelle mithilfe des Schlüsselworts implements und muss konkrete Implementierungen für alle in dieser Schnittstelle 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 print()-Methode bereitstellt. Wenn du vergisst, eine erforderliche Methode zu implementieren, löst PHP einen schwerwiegenden Fehler aus.
Verschiedene Klassen können dieselbe Schnittstelle 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 jeder behandelt das Drucken je nach seinem Zweck unterschiedlich.
Wichtiger Punkt: Verwende implements, um eine Klasse mit einem Interface zu verbinden, und definiere anschließend alle erforderlichen Methoden. Jede implementierende Klasse stellt ihre eigene Logik bereit und garantiert gleichzeitig, dass dieselben Methodensignaturen vorhanden sind.
Aufgabe
EinfachErstelle ein Nachrichtensystem, das veranschaulicht, wie verschiedene Klassen dieselbe Schnittstelle auf jeweils eigene Weise implementieren können.
Du wirst drei Dateien erstellen, die zusammenarbeiten, um verschiedene Nachrichtentypen zu verarbeiten:
Messageable.php: Definiere die SchnittstelleMessageablemit zwei Methodensignaturen:compose($content)unddeliver(). Diese Schnittstelle legt den Vertrag fest, den alle Nachrichtentypen erfüllen müssen.Email.php: Erstelle eineEmail-Klasse, dieMessageableimplementiert. Binde die Schnittstellendatei am Anfang ein. Die Klasse sollte eine private Eigenschaft$recipientund eine private Eigenschaft$bodybesitzen. Der Konstruktor akzeptiert die Empfängeradresse. Implementierecompose($content), um den Inhalt in$bodyzu speichern und"Email composed"zurückzugeben. Implementieredeliver(), um"Email to [recipient]: [body]"zurückzugeben.SMS.php: Erstelle eineSMS-Klasse, die ebenfallsMessageableimplementiert. Binde die Schnittstellendatei am Anfang ein. Die Klasse sollte eine private Eigenschaft$phoneNumberund eine private Eigenschaft$textbesitzen. Der Konstruktor akzeptiert die Telefonnummer. Implementierecompose($content), um den Inhalt in$textzu speichern und"SMS composed"zurückzugeben. Implementieredeliver(), um"SMS to [phoneNumber]: [text]"zurückzugeben.
Binde in main.php sowohl die Dateien für Email als auch für SMS ein. Du erhältst drei Eingaben: eine E-Mail-Adresse, eine Telefonnummer und einen Nachrichteninhalt. Erstelle ein Email-Objekt mit der E-Mail-Adresse und ein SMS-Objekt mit der Telefonnummer. Rufe bei beiden Objekten compose() mit dem Nachrichteninhalt auf und gib jedes Ergebnis in einer eigenen Zeile aus. Rufe anschließend bei beiden Objekten deliver() auf und gib 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 entsprechend ihrem eigenen Zweck: E-Mails zeigen die Empfängeradresse an, während SMS-Nachrichten die Telefonnummer anzeigen.
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: Erstelle ein Email-Objekt mit der E-Mail-Adresse
// TODO: Erstelle ein SMS-Objekt mit der Telefonnummer
// TODO: Rufe compose() auf beiden Objekten auf und gib die Ergebnisse aus
// Order: email compose, then SMS compose
// TODO: Rufe deliver() auf beiden Objekten auf und gib 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 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