Vererbung ist ein wichtiges Konzept der objekt-orientierten Programmierung. Wenn eine Klasse von einer anderen Klasse abgeleitet wird, spricht man von Vererbung.
Vererbung, ableiten, Ober-Klasse, Unter-Klasse… bitte was?
Warum gibt es die Vererbung? Angenommen wir haben eine Klasse, nennen wir sie „Oberklasse“, möchten nun aber ein Klasse erstellen, die die gleichen Eigenschaften und Methoden hat wie die Oberklasse + noch ein paar mehr, dann können wir mittels Vererbung alle Eigenschaften und Methoden der Oberklasse an unsere neue „Unterklasse“ übergeben.
Dazu ein abstraktes Beispiel:
<?php error_reporting(E_ALL); //jegliche Fehlermeldungen und Warnungen werden angezeigt class Oberklasse { public $zahl1; public $zahl2; public function addieren() { return ($this->zahl1 + $this->zahl2); } } class Unterklasse { public $zahl1; public $zahl2; public function subtrahieren() { return ($this->zahl1 - $this->zahl2); } } $obj1 = new Oberklasse; $obj1->zahl1 = 5; $obj1->zahl2 = 3; $obj2 = new Unterklasse; $obj2->zahl1 = 5; $obj2->zahl2 = 1; echo $obj1->addieren(); echo '<br />'; echo $obj2->subtrahieren(); ?>
In diesem Beispiel passiert noch keine Vererbung. Wir haben zwei Klassen („Oberklasse“ und „Unterklasse“) mit jeweils zwei Eigenschaften („zahl1“ und „zahl2) und jeweils einer Methode. Die Oberklasse kann ihre beiden Zahlen addieren und das Ergebnis ausgeben. Die Unterklasse kann ihre beiden Zahlen subtrahieren und das Ergebnis zurückgeben. Bis hierhin nichts neues.
Nun möchten wir aber, dass die „Unterklasse“ ebenfalls die Methode „addieren()“ hat. Anstelle diese Methode jetzt nochmal neu in der Unterklasse zu erstellen (und sich an zwei Stellen um den gleichen Code kümmern zu müssen), können wir einfach die Unterklasse von der Oberklasse ableiten (mit dem Schlüsselwort extends):
<?php error_reporting(E_ALL); //jegliche Fehlermeldungen und Warnungen werden angezeigt class Oberklasse { public $zahl1; public $zahl2; public function addieren() { return ($this->zahl1 + $this->zahl2); } } class Unterklasse extends Oberklasse { public function subtrahieren() { return ($this->zahl1 - $this->zahl2); } } $obj2 = new Unterklasse; $obj2->zahl1 = 5; $obj2->zahl2 = 1; echo $obj2->addieren(); ?>
Ohne Vererbung würden wir beim Aufruf der Methode „addieren“ folgende Fehlermeldung erhalten:
Fatal error: Call to undefined method Unterklasse::addieren() ...
So aber erhalten wir das Ergebnis: 6
Vererbung ist also, wenn wir eine Klasse von einer anderen Klasse ableiten. Die abgeleitete Klasse bekommt dabei alle Eigenschaften und Methoden der ableitenden Klasse. Diese Eigenschaften und Methoden müssen daher nicht nochmal in der Unterklasse geschrieben werden. Da auch Eigenschaften vererbt werden brauchen wir „zahl1“ und „zahl2“ nun auch nicht mehr in der Unterklasse deklarieren.
Methoden überschreiben
Angenommen wir haben eine Oberklasse mit einer Methode die nicht ganz so arbeitet wie wir wünschen. Das ist kein Problem, denn wir können Methoden und Eigenschaften in der abgeleiteten Klasse überschreiben.
Folgendes Beispiel macht zwar wenig Sinn, zeigt aber wie Methoden überschrieben werden können:
<?php error_reporting(E_ALL); class Oberklasse { public $zahl1; public $zahl2; public function addieren() { return ($this->zahl1 + $this->zahl2); } } class Unterklasse extends Oberklasse { public function addieren() { return ($this->zahl1 - $this->zahl2); } public function subtrahieren() { return ($this->zahl1 - $this->zahl2); } } $obj2 = new Unterklasse; $obj2->zahl1 = 8; $obj2->zahl2 = 3; echo $obj2->addieren(); ?>
Ausgabe
5
In der „Unterklasse“ überschreiben wir die Methode „addieren()“. Anstelle die beiden Zahlen nun zu addieren, werden sie voneinander subtrahiert.
Vererben magischer Methoden – __construct()
Die magische Methode __construct() hast du schon kennengelernt.
Auch diese können wir ganz einfach an die Unterklasse vererben:
<?php error_reporting(E_ALL); class Oberklasse { public $zahl1; public $zahl2; function __construct($zahl1, $zahl2) { $this->zahl1 = $zahl1; $this->zahl2 = $zahl2; } public function addieren() { return ($this->zahl1 + $this->zahl2); } } class Unterklasse extends Oberklasse { public function subtrahieren() { return ($this->zahl1 - $this->zahl2); } } $obj1 = new Unterklasse(5, 1); echo $obj1->addieren(); echo '<br />'; $obj2 = new Unterklasse(14, 5); echo $obj2->addieren(); ?>
Jetzt können wir einfach mit unserem Konstruktor den beiden Variablen „zahl1“ und „zahl2“ einen Wert übergeben. Die Methode __construct wird an die Unterklasse vererbt und daher kann auch unser „$obj2“ diese Variablendeklaration verwenden.
Ausgabe:
6 19