Eines der großen Themen und damit eine Stärke der objektorientierten Programmierung ist die Vererbung. Klassen können sowohl Variablen wie auch Funktionen einer Klasse vererben. Diese Variablen und Funktionen können dann genauso benutzt werden, als ob diese in der Klasse selbst definiert worden sind.
Das folgende Programm demonstriert die Vererbung:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php class Auto { protected $tank = 100; public function fahren ($strecke) { $this->tank = $this->tank - $strecke * 0.1; echo ("Tank bei $this->tank l."); } } class Pickup extends Auto { private $ladekapazitaet = 50; public function laden($gewicht) { $this->ladekapazitaet -= $gewicht; echo ("Restkapazität $this->ladekapazitaet."); echo ("$this->tank l im Tank."); } } $derPickup = new Pickup(); $derPickup->fahren(5); // Ausgabe: Tank bei 99.5 l. $derPickup->laden(10); // Ausgabe: Restkapazität 40. // 99.5 l im Tank. $meinAuto = new Auto(); $meinAuto->fahren(7); // Ausgabe: Tank bei 99.3 l. $meinAuto->laden(1); // Fehler ?> |
Innerhalb dieses Programmes erbt die Klasse Pickup
von der Klasse Auto
. Dabei wird die eine Funktion fahren()
sowie die protected
-Variable $tank
der Klasse Auto
mit vererbt. Wenn nun – wie im unteren Teil des Programmes dies geschieht – ein Objekt des Typs Pickup
erstellt wird, so besitzt dieses Objekt die Funktion fahren()
, welche im Beispiel oben auch aufgerufen wird und die entsprechende Ausgabe erzeugt. Die Funktion laden()
ist nur für die Klasse Pickup
definiert. Innerhalb dieser Funktion lässt sich jedoch trotzdem mit $this->tank
die protected
-Variable der Oberklasse Auto
auslesen. Würde übrigens eine neue Variable $tank
in der Unterklasse Pickup
definiert werden, so würde diese die Variable der Oberklasse überdecken. Dies bedeutet, dass nun zwei $tank
-Variablen in den Pickup
-Objekten existieren würden, von denen nur jeweils eine sichtbar wäre. Ebenso wäre – wie weiter oben schon gesagt – auch ein Zugriff auf eine private
-Variable hier nicht möglich. Die letzte Zeile des Programmes endet mit einem Fehler. Die Methode laden()
ist in der Oberklasse nicht definiert. Folgende Ausgabe wird geliefert: Fatal error: Uncaught Error: Call to undefined method Auto::laden()
Wie Variablen überdeckt werden können, können auch Methoden überdeckt werden. Da ein Pickup größer als ein Auto ist, verbraucht dieser auch mehr Treibstoff. Es wird deshalb in der Klasse Pickup
die Funktion fahren()
wie folgt überschrieben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php class Auto { protected $tank = 100; public function fahren ($strecke) { // ... wie oben ... } } class Pickup extends Auto { // Überschreibende Funktion public function fahren ($strecke) { $this->tank = $this->tank - $strecke * 0.2; echo ("Tank bei $this->tank l."); } } $derPickup = new Pickup(); $derPickup->fahren(5); // Ausgabe: Tank bei 99 l. $meinAuto = new Auto(); $meinAuto->fahren(5); // Ausgabe: Tank bei 99.5 l. ?> |
Es ist zu sehen, dass die Funktion überschrieben ist und der Pickup auf der gleichen Strecke einen halben Liter mehr Treibstoff verbraucht.
Wenn Vererbung stattfindet, kann die Sichtbarkeit von Funktionen geändert werden. Es ist möglich, eine Funktion immer sichtbarer zu machen. Das bedeutet, eine überschreibende Funktion kann protected
oder public
gekennzeichnet sein, statt dass sie private
bleibt, wie die überschriebene Funktion. Umgekehrt ist es jedoch nicht möglich, dass mit einer Vererbung der Zugriff auf eine Funktion eingeschränkt wird.