Einführung in Schnittstellen
Teil des Abschnitts Objektorientierte Programmierung der PHP-Journey von Coddy. Lektion 27 von 91.
Ein Interface definiert einen Vertrag, den Klassen einhalten müssen. Im Gegensatz zu abstrakten Klassen, die sowohl abstrakte als auch konkrete Methoden enthalten können, deklariert ein Interface nur Methodensignaturen ohne jegliche Implementierung. Stell es dir als ein Versprechen vor: Jede Klasse, die ein Interface implementiert, garantiert, dass sie diese spezifischen Methoden bereitstellt.
Du definierst ein Interface mit dem Schlüsselwort interface:
<?php
interface Printable {
public function print();
}
Dieses Interface erklärt, dass jede Klasse, die Printable implementiert, eine print()-Methode haben muss. Das Interface kümmert sich nicht darum, wie die Methode funktioniert, sondern nur darum, dass sie existiert.
Hier ist ein einfaches Beispiel, das die grundlegende Struktur zeigt:
<?php
interface Drivable {
public function start();
public function stop();
}
Beachte, dass Schnittstellenmethoden keinen Rumpf haben, sondern nur die Signatur, die mit einem Semikolon endet. Alle Methoden in einer Schnittstelle sind implizit öffentlich, daher kannst du private oder protected nicht verwenden.
Schnittstellen sind leistungsfähig, weil sie es voneinander unabhängigen Klassen ermöglichen, gemeinsames Verhalten zu teilen. Ein Car und ein Motorcycle haben möglicherweise in Bezug auf die Vererbung nichts gemeinsam, aber beide können Drivable implementieren, um zu garantieren, dass sie über die start()- und stop()-methods verfügen.
Wichtiger Punkt: Ein Interface legt fest, welche Methoden eine Klasse haben muss, nicht, wie sie funktionieren sollen. Es stellt einen Vertrag auf, den implementierende Klassen erfüllen müssen.
Aufgabe
EinfachErstelle ein einfaches Nachrichtensystem, das dich mit Interfaces vertraut macht. Du definierst ein Interface, das einen Vertrag dafür festlegt, wie Nachrichten verarbeitet werden sollen, und damit die Grundlage für die implementierenden Klassen schafft, die du in der nächsten Lektion erstellen wirst.
Du wirst deinen Code auf zwei Dateien verteilen:
Messageable.php: Definiere ein Interface namensMessageable, das zwei Methodensignaturen deklariert:compose($content)zum Erstellen einer Nachricht unddeliver()zum Senden. Denke daran: Interface-Methoden haben keinen Rumpf, sondern nur die Signatur, die mit einem Semikolon endet.main.php: Binde die Datei Messageable ein. Um zu überprüfen, ob dein Interface korrekt definiert ist, verwende die PHP-Funktioninterface_exists(), um zu prüfen, obMessageableexistiert. Verwende dannReflectionClass, um dein Interface zu untersuchen und seine Methoden aufzulisten. Erstelle eine Reflection deines Interfaces, rufe seine Methoden mitgetMethods()ab (wasReflectionMethod-Objekte zurückgibt) und gib dengetName()jeder Methode in einer eigenen Zeile aus.
Deine Ausgabe sollte die beiden Methodennamen anzeigen, die dein Interface deklariert, jeweils in einer eigenen Zeile und in der Reihenfolge, in der du sie definiert hast.
Diese Aufgabe konzentriert sich ausschließlich auf das Definieren eines Interfaces: des Vertrags, den zukünftige Klassen erfüllen müssen. Du legst fest, welche Methoden vorhanden sein müssen, ohne dir Gedanken darüber zu machen, wie sie funktionieren werden. Diese Implementierung kommt in der nächsten Lektion!
Probier es selbst
<?php
// Die Messageable-Interface-Datei einbinden
require_once 'Messageable.php';
// TODO: Verwende interface_exists(), um zu prüfen, ob das Messageable-Interface existiert
// TODO: Erstelle ein ReflectionClass-Objekt für das Messageable-Interface
// TODO: Hole die Methoden mit getMethods()
// TODO: Durchlaufe die Methoden und gib jeden Methodennamen in einer eigenen 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