Eine abstrakte Klasse in PHP ist eine spezielle Art von Klasse, die als Vorlage für andere Klassen dient. Sie kann nicht direkt instanziiert werden, das heißt, es kann kein Objekt direkt daraus erzeugt werden. Stattdessen sind abstrakte Klassen dafür gedacht, eine gemeinsame Struktur und ein Verhalten zu definieren, denen Unterklassen folgen müssen – bei gleichzeitiger Flexibilität in der Implementierung.
Zentrale Eigenschaften abstrakter Klassen in PHP
- Kann nicht instanziiert werden: Es ist nicht möglich, direkt ein Objekt aus einer abstrakten Klasse zu erstellen.
- Abstrakte Methoden: Werden ohne Implementierung deklariert. Unterklassen, die die abstrakte Klasse erweitern, müssen diese implementieren.
- Konkrete Methoden: Abstrakte Klassen können auch vollständig implementierte Methoden, Eigenschaften und Konstanten enthalten.
- Vererbung: Andere Klassen können die abstrakte Klasse erweitern und ihr Verhalten erben, während sie gleichzeitig eigene spezifische Implementierungen bereitstellen.
Beispiel in PHP
<?php
abstract class Vehicle {
// Abstrakte Methode (muss von jeder Unterklasse implementiert werden)
abstract public function startEngine(): void;
// Konkrete Methode (kann von Unterklassen verwendet oder überschrieben werden)
public function stopEngine(): void {
echo "Motor gestoppt.\n";
}
}
class Car extends Vehicle {
public function startEngine(): void {
echo "Auto-Motor gestartet.\n";
}
}
class Motorcycle extends Vehicle {
public function startEngine(): void {
echo "Motorrad-Motor gestartet.\n";
}
}
// Verwendung
$car = new Car();
$car->startEngine(); // Ausgabe: Auto-Motor gestartet.
$car->stopEngine(); // Ausgabe: Motor gestoppt.
$bike = new Motorcycle();
$bike->startEngine(); // Ausgabe: Motorrad-Motor gestartet.
$bike->stopEngine(); // Ausgabe: Motor gestoppt.
Hier definiert die abstrakte Klasse Vehicle die allgemeine Struktur:
startEngine() ist abstrakt, daher muss jede Unterklasse (Car, Motorcycle) sie implementieren.
stopEngine() ist konkret, sodass sie unverändert wiederverwendet oder bei Bedarf überschrieben werden kann.
Vorteile der Verwendung abstrakter Klassen in PHP
- Kapselung gemeinsamer Logik – Gemeinsamer Code kann in der abstrakten Klasse zentralisiert werden, wodurch Duplikate reduziert werden.
- Konsistentes Design – Abstrakte Methoden erzwingen Regeln, die alle Unterklassen einhalten müssen.
- Flexibilität – Verbindet verpflichtende Implementierungen (abstrakte Methoden) mit optionalem Standardverhalten (konkrete Methoden).
- Polymorphismus – Unterschiedliche Unterklassen können als derselbe Typ behandelt werden (z. B. alle
Vehicle-Objekte), behalten aber ihre eigenen Implementierungen.
Anwendungsfälle in PHP
- Definition von Basismodellen wie
PaymentGateway, Vehicle oder Shape, bei denen bestimmte Funktionalitäten je nach Implementierung variieren müssen.
- Erstellung von Framework-Komponenten (z. B. Symfony und Laravel nutzen abstrakte Klassen intensiv in ihrem Kern).
- Durchsetzung von Coding-Standards in großen Teams oder Projekten, indem sichergestellt wird, dass alle Unterklassen eine konsistente Struktur teilen.
Abstrakte Klasse vs. Interface in PHP
Obwohl sowohl abstrakte Klassen als auch Interfaces Verträge für Unterklassen definieren:
- Abstrakte Klassen können sowohl abstrakte als auch konkrete Methoden, Eigenschaften und Konstanten enthalten.
- Interfaces (in PHP) können nur Methodensignaturen definieren (seit PHP 8 auch Konstanten und Standardmethoden über Traits).
Abstrakte Klassen eignen sich daher besser, wenn sowohl Struktur als auch Verhalten geteilt werden sollen, während Interfaces besser für die Definition reiner Verträge geeignet sind.
In PHP sind abstrakte Klassen ein mächtiges OOP-Feature, das Flexibilität und Kontrolle vereint und es Entwicklern ermöglicht, sauberen, wiederverwendbaren und erweiterbaren Code zu schreiben.