Wenn Sie das Schlüsselwort abstract
vor einer Funktion verwenden, so darf diese Funktion keinen Funktionsrumpf beinhalten. Dieser muss dann erst zwingend durch Unterklassen zur Verfügung gestellt werden. Eine Klasse, die mindestens eine abstrakte Funktion enthält, muss auch selbst als abstract
gekennzeichnet werden. Hierbei ist zu beachten, dass von abstrakten Klassen keine Objekte gebildet werden können. Nur von den konkreten Klassen, die von dieser abstrakten Klasse erben und die abstrakten Methoden dann implementieren, können Objekte gebildet werden. In dem folgenden Beispiel wird unsere Klassenhierarchie um eine Ebene erweitert. Eine weitere abstrakte Oberklasse Fahrzeug
wird eingefügt. Die abstrakte Methode fahren()
wird dann in Auto
implementiert:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php abstract class Fahrzeug { abstract public function fahren ($strecke); } class Auto extends Fahrzeug { protected $tank = 100; public function fahren ($strecke) { $this->tank = $this->tank - $strecke * 0.1; echo ("Tank bei $this->tank l."); } } ?> |
Manchmal macht es Sinn, abstrakte Klassen zu deklarieren, die nur aus abstrakten Funktionen bestehen, welche dann durch eine implementierende Klasse bereitgestellt werden sollen. Für diesen Sonderfall existieren in PHP die sogenannten Interfaces, auch Schnittstellen genannt. Ein solches Interface bekommt das Schlüsselwort interface
statt class
. Es ist automatisch abstrakt, genauso wie alle seine Funktionen abstrakt sind. Zusätzlich sind die Funktionen automatisch auch öffentlich. Das Schlüsselwort abstract
muss entfallen. In der implementierenden Klasse ist implements
statt extends
zu schreiben:
1 2 3 4 5 6 7 8 |
<?php interface Fahrzeug { function fahren ($strecke); } class Auto implements Fahrzeug { ... ?> |
Interfaces können von anderen Interfaces erben und diese so erweitern. Zusätzlich ist es möglich, dass eine Klasse nicht nur ein Interface implementiert, sondern gleich mehrere. Diese werden durch Kommata getrennt. Eine Vererbung von mehreren Klassen gleichzeitig ist hingegen in PHP nicht erlaubt. Eine Klasse kann immer nur von einer anderen Klasse erben.