Menu

PHP abstrakte Klasse: abstrakte Methoden und Einsatz

Eine abstrakte PHP-Klasse wird mit abstract class Name deklariert und lässt sich nicht instanziieren: Sie existiert, um erweitert zu werden. Sie kann Eigenschaften, einen Konstruktor und fertige Methoden enthalten, dazu abstract-Methoden ohne Rumpf, die jede Kindklasse implementieren muss.

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

Eine abstrakte PHP-Klasse wird mit abstract class Name deklariert und lässt sich nicht mit new erzeugen. Sie ist eine Basis für andere Klassen: Sie kann Eigenschaften, einen Konstruktor und fertige Methoden haben, dazu abstract-Methoden ohne Rumpf, die jede Kindklasse implementieren muss.

describe() wird einmal in Shape geschrieben und ruft area() auf, das jedes Kind liefert. Die abstrakte Klasse garantiert, dass die Methode existiert, also kann sich describe() darauf verlassen.

Eine abstrakte Klasse lässt sich nicht mit new erzeugen

Eine abstrakte Klasse ist absichtlich unvollständig: Shape::area() hat keinen Rumpf, also hätte ein einfaches Shape-Objekt nichts auszuführen. PHP weigert sich, eines zu erzeugen, und wirft einen Error:

Abstrakte Methoden: die Regeln

Eine abstrakte Methode hat eine Signatur und ein Semikolon statt eines Rumpfs. Jedes Kind muss sie mit kompatibler Signatur und derselben oder einer weiteren Sichtbarkeit implementieren: Eine abstract protected-Methode darf im Kind protected oder public werden, nie private. Eine Klasse mit auch nur einer abstrakten Methode muss selbst als abstract deklariert sein.

Ein Kind, das eine abstrakte Methode auslässt, stoppt das Skript, bevor irgendetwas davon läuft, außer das Kind ist ebenfalls als abstract deklariert und überlässt die Methode seinen eigenen Kindern:

PHP Fatal error:  Class Square contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Shape::area) in /home/index.php on line 3

Das Template-Method-Muster

Der häufigste Grund für eine abstrakte Klasse: eine feste Folge von Schritten, in der sich einige Schritte unterscheiden. Die Basisklasse besitzt die Folge in einer final-Methode, und die Kinder füllen die Schritte aus. Hier läuft derselbe Bericht als reiner Text und als HTML-Tabelle:

Führe es aus, und der Tab Page zeigt die HTML-Tabelle über der Textversion. open() und close() haben Standardrümpfe, also überschreibt nur HtmlReport sie; row() ist abstrakt, weil es keinen sinnvollen Standard gibt. render() als final zu markieren verhindert, dass ein Kind die Reihenfolge der Schritte ändert.

Eine abstrakte Klasse kann ein Interface implementieren

Eine abstrakte Klasse darf implements deklarieren und einige Methoden des Interfaces ihren Kindern überlassen. Das ist der Standardweg, ein Interface (den Typ) mit einer Basisklasse (dem gemeinsamen Code) zu kombinieren:

Der Code verwendet das Interface Cache als Typangabe, also kann eine Klasse, die BaseCache nicht erweitern kann (weil sie schon etwas anderes erweitert), Cache trotzdem direkt implementieren.

Wann eine abstrakte Klasse passt und wann nicht

Greif zu einer abstrakten Klasse, wenn die Klassen einer Familie echten Code teilen: Eigenschaften, einen Konstruktor, Methoden, die für alle gleich sind. Wenn die Basis nur abstrakte Methoden enthalten würde, ist sie ein verkleidetes Interface, und ein Interface ist die bessere Wahl, weil eine Klasse viele Interfaces implementieren, aber nur eine Klasse erweitern kann. Wenn du nur ein paar Hilfsmethoden zwischen nicht verwandten Klassen teilen willst, verwendest du einen Trait, statt sie unter eine Elternklasse zu zwingen.

Ein schneller Test, bevor du abstract class schreibst: Wäre jedes Kind wirklich eine Art der Basis (Circle ist eine Shape)? Lautet die ehrliche Antwort „es kann das“ statt „es ist eines davon“, schreib ein Interface.

Häufig gestellte Fragen

Was ist eine abstrakte Klasse in PHP?

Eine mit abstract class Name deklarierte Klasse, die sich nicht mit new erzeugen lässt. Sie ist eine Basis für andere Klassen: Sie kann Eigenschaften, einen Konstruktor und normale Methoden enthalten und abstract-Methoden deklarieren, die jede Kindklasse implementieren muss.

Was ist eine abstrakte Methode in PHP?

Eine mit abstract deklarierte Methode ohne Rumpf: abstract protected function render(array $rows): string;. Eine Klasse, die eine enthält, muss selbst als abstract deklariert sein, und jede nicht abstrakte Kindklasse muss eine Methode mit kompatibler Signatur definieren.

Kann eine abstrakte Klasse in PHP einen Konstruktor haben?

Ja. Du kannst new nicht auf die abstrakte Klasse anwenden, aber ihr Konstruktor läuft, wenn eine Kindklasse erzeugt wird, entweder automatisch (wenn das Kind keinen Konstruktor hat) oder über parent::__construct(...).

Kann man in PHP eine abstrakte Klasse instanziieren?

Nein. new Shape() auf eine abstrakte Klasse wirft einen Error: Cannot instantiate abstract class Shape. Erzeuge stattdessen ein Objekt einer konkreten Kindklasse, zum Beispiel new Circle(2).

Wann sollte ich in PHP eine abstrakte Klasse verwenden?

Wenn mehrere verwandte Klassen echten Code teilen (Eigenschaften, einen Konstruktor, gemeinsame Methoden) und sich in wenigen Schritten unterscheiden. Leg den gemeinsamen Code in die abstrakte Klasse und deklariere die abweichenden Schritte als abstract. Gibt es keinen gemeinsamen Code und brauchst du nur einen Vertrag, verwendest du ein Interface.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S