Menu

PHP Interface: implements, Konstanten und Beispiele

Ein PHP-Interface listet Methoden auf, die eine Klasse zu haben verspricht: interface Shape { public function area(): float; }, und class Circle implements Shape muss dann area() definieren. Hier: Typangaben mit Interfaces, mehrere Interfaces implementieren, Interface-Konstanten, Interfaces erweitern, eingebaute Interfaces wie Countable und Interface vs abstrakte Klasse.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Ein PHP-Interface deklariert Methoden, die eine Klasse bereitzustellen verspricht, ganz ohne Code: interface Shape { public function area(): float; }. Eine Klasse, die implements Shape schreibt, muss area() definieren, und jede Funktion mit der Typangabe Shape akzeptiert diese Klasse.

describe() weiß nicht, welche Klasse es bekommt, und es ist ihm egal. Es verlässt sich nur auf das Versprechen des Interfaces, also funktioniert ein neues Triangle implements Shape damit, ohne dass sich eine Zeile ändert.

Gegen ein Interface programmieren

Der übliche Grund für ein Interface ist, Code von einer Fähigkeit abhängig zu machen statt von einer bestimmten Klasse. Hier akzeptiert ein Bestellservice jeden Notifier, sodass derselbe Code in Produktion E-Mails verschicken und in einem Test Nachrichten sammeln kann:

Mehrere Interfaces implementieren

Eine Klasse erweitert höchstens eine Elternklasse, kann aber so viele Interfaces implementieren, wie sie braucht. Führe sie nach implements auf, durch Kommas getrennt, und definiere die Methoden aller:

JsonSerializable ist eines der eingebauten Interfaces von PHP: Wer es implementiert, bestimmt, was json_encode() für das Objekt erzeugt.

Interface-Konstanten

Ein Interface kann Konstanten deklarieren. Jede implementierende Klasse erbt sie, und du kannst sie über den Interface-Namen oder den Klassennamen lesen:

Interfaces können in PHP 8.3 keine Eigenschaften haben, nur Methoden und Konstanten. Die Methoden dürfen statisch sein: public static function fromArray(array $data): static; im Interface verpflichtet jede Klasse, diese statische Methode zu definieren. Für eine feste Menge zusammengehöriger Werte passt ein Enum oft besser als eine Liste von Interface-Konstanten.

Ein Interface kann andere Interfaces erweitern

Auch Interfaces verwenden extends, und anders als Klassen können sie mehrere auf einmal erweitern. Eine Klasse, die das Kind-Interface implementiert, muss die Methoden der ganzen Kette definieren:

Eingebaute Interfaces: Countable, IteratorAggregate, Stringable

PHP bringt Interfaces mit, die Objekte an die Sprache anbinden. Countable lässt count($obj) funktionieren, IteratorAggregate lässt foreach funktionieren, und Stringable wird automatisch von jeder Klasse mit einer Methode __toString() implementiert:

Eine Methode vergessen

Wenn eine Klasse behauptet, ein Interface zu implementieren, aber eine Methode fehlt, stoppt PHP mit einem fatalen Fehler, der die fehlende Methode nennt:

Füge eine Methode total() hinzu, und das Skript läuft. Eine abstrakte Klasse darf Interface-Methoden undefiniert lassen, und genau diesen Ausweg schlägt die Fehlermeldung vor.

Interface vs abstrakte Klasse

Beide definieren Methoden, die eine Klasse haben muss, und beide lassen sich als Typangabe verwenden. Der Unterschied liegt darin, was sie sonst enthalten dürfen und wie viele eine Klasse verwenden kann:

InterfaceAbstrakte Klasse
Methodenrümpfekeine (nur Signaturen)abstrakte und fertige Methoden
Eigenschaftenneinja
Konstruktorkann einen deklarieren, selten nützlichja, mit Code
Sichtbarkeit der Methodennur publicpublic, protected, private
Konstantenjaja
Wie viele pro Klassebeliebig viele (implements A, B, C)eine (extends Base)
Typischer Einsatzeine Fähigkeit: Exportable, Countablegemeinsamer Code einer Familie: Model, Controller

Sie lassen sich gut kombinieren: Definiere das Interface für die Typangabe und biete eine abstrakte Basisklasse an, die es mit dem gemeinsamen Code implementiert. Klassen, die eine andere Basis brauchen, können das Interface trotzdem direkt implementieren.

Häufig gestellte Fragen

Was ist ein Interface in PHP?

Eine Liste öffentlicher Methodensignaturen ohne Rumpf: interface Logger { public function log(string $msg): void; }. Eine Klasse mit implements Logger muss jede Methode darin definieren, und jeder Code mit der Typangabe Logger akzeptiert diese Klasse.

Kann eine PHP-Klasse mehrere Interfaces implementieren?

Ja. Führe sie nach implements auf, durch Kommas getrennt: class File implements Readable, Writable, Countable. Die Klasse muss die Methoden aller definieren. So deckt PHP ab, was in anderen Sprachen Mehrfachvererbung erledigt.

Was ist der Unterschied zwischen einem Interface und einer abstrakten Klasse in PHP?

Ein Interface deklariert nur öffentliche Methoden (und Konstanten); es hat keine Eigenschaften und keinen Methodencode, und eine Klasse kann viele implementieren. Eine abstrakte Klasse kann neben ihren abstrakten Methoden Eigenschaften, Konstruktoren und fertige Methoden enthalten, aber eine Klasse kann nur eine erweitern. Verwende ein Interface für eine Fähigkeit („lässt sich exportieren“), eine abstrakte Klasse für gemeinsamen Code einer Klassenfamilie.

Kann ein PHP-Interface Eigenschaften haben?

Nicht in PHP 8.3: Ein Interface darf Methodensignaturen und Konstanten (const VERSION = 2;) enthalten, aber keine Eigenschaften. Eigenschaftsdeklarationen in Interfaces (Property Hooks) kamen erst mit PHP 8.4.

Wie prüfe ich in PHP, ob ein Objekt ein Interface implementiert?

Mit instanceof: $obj instanceof Countable ist wahr, wenn die Klasse des Objekts das Interface implementiert, direkt oder über eine Elternklasse. class_implements($obj) liefert die Namen aller Interfaces, die die Klasse implementiert.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S