Das Prinzip der Vererbung wurde auf der vorausgehenden Seite bereits vorgestellt. Elternklassen und
Kinderklassen können voneinander entsprechend ihrem verwandtschaftlichen Verhältnis alle Eigenschaften und Methoden erben,
insofern diese Eigenschaften und Methoden nicht als private Eigenschaften oder private Methoden definiert wurden. Weiterhin ist
das verwandtschaftliche durch das PHP Schlüsselwort extends anzugeben. Nachfolgend ein weiteres Beispiel. In diesem Beispiel
wird in der Klasse der Kinder mit Hilfe der Methode getFamilie auf die Methode setEltern aus der Klasse der Eltern
zugegriffen.
Ein weiteres Beispiel zum Stichpunkt Vererbung (klasse-07.php):
<?php class Eltern { private $frau = "Mutter"; private $mann = "Vater"; protected function setEltern() { return $this->frau." und ".$this->mann; } } class Kinder extends Eltern { private $kindw = "Tochter"; private $kindm = "Sohn"; private $kinder; public function getFamilie() { $this->kinder = $this->kindw." und ".$this->kindm; return "Ausgabe: ".$this->setEltern()." mit ".$this->kinder."\n"; } } $ausgabe = new Kinder(); echo $ausgabe->getFamilie(); ?>
Das Ergebnis der Ausgabe lautet wie folgt:
Mutter und Vater mit Tochter und Sohn
Bei den bisherigen Beispielen wurden stets zuerst die Klassen definiert und erst danach Objekte als
Instanzen dieser Klassen erzeugt. Sollten Eigenschaften und Methoden vererbt werden, wurde ebenfalls eine gewisse Reihenfolge
beim Definieren der Klassen beachtet. Doch was passiert eigentlich, wenn diese Reihenfolge nicht eingehalten wird?
Allgemein sollten Klassen definiert werden, bevor Objekte als Instanzen dieser Klassen erzeugt werden. Weiterhin sollten bei
erbenden und vererbenden Klassen die Vaterklassen bereits zur Verfügung stehen, bevor die Kinderklassen deklariert werden. Doch
wer es etwas genauer wissen möchte, kommt um eigene Tests nicht umhin.
Für die durchgeführten Tests diente dabei das obige Beispiel (klasse-07.php), wobei lediglich die Reihenfolge vertauscht
wurde.
Normale Reihenfolge funktioniert:
<?php class Eltern { //... } class Kinder extends Eltern { // ... } $ausgabe = new Kinder(); echo $ausgabe->getFamilie(); ?>
Instanziieren vor dem Definieren funktionierte mit den Beispielklassen:
<?php $ausgabe = new Kinder(); echo $ausgabe->getFamilie(); class Eltern { //... } class Kinder extends Eltern { // ... } ?>
Kinderklasse vor Vaterklasse deklarieren funktionierte mit den Beispielklassen:
<?php class Kinder extends Eltern { // ... } class Eltern { // ... } $ausgabe = new Kinder(); echo $ausgabe->getFamilie(); ?>
Instanziieren vor Definieren der Klassen plus Kinderklasse vor Vaterklasse deklarieren funktionierte nicht mehr:
<?php $ausgabe = new Kinder(); echo $ausgabe->getFamilie(); class Kinder extends Eltern { // ... } class Eltern { //... } // Fatal error: Class 'Kinder' not found in ... ?>
Um Fehler wie den letzten zu vermeiden, bietet PHP das so benannte Autoloading von Klassen an. Mehr zum
Thema Autoloading im nachfolgenden Abschnitt. Ein weiteres Beispiel für die Vererbung von Eigenschaften und Methoden mit etwas
mehr praktischen Bezug finden Sie unter: cURL-Klasse - Variante II
Um mit Hilfe einer Funktion Klassen automatisch laden zu können, müssen die Klassen unter ihren
Klassennamen abgelegt werden und unter diesen Namen erreichbar sein. Das eigentliche Laden der Klassen übernimmt dann eine
Autoloading Funktion.
Ausgehend vom ersten Beispiel auf dieser Seite (klasse-07.php), wird die Funktion __autoload() im nächsten Beispiel
die Bezeichner Eltern und Kinder in der Variablen $class speichern und somit zur Include-Anweisung durchreichen und die
Include-Anweisung wird versuchen die Dateien der Klassen eltern.php und kinder.php zu laden. Da die Funktion __autoload() von
den Namen der Klasse ausgeht, muss bei der Include-Anweisung die Funktion strtolower() verwendet werden, um die Namen der
Klassen in Kleinbuchstaben umzuwandeln. Zumindest wenn das Script unter Linux ausgeführt wird, ist eine Umwandlung mit
strtolower erforderlich.
Autoloading mit der Funktion __autoload():
<?php function __autoload($class) { include strtolower($class).".php"; } ?>
Die Funktion __autoload() gehört zu den sogenannten magischen Methoden und wird aufgerufen, wenn ein
Zugriff auf eine noch nicht definierte Klasse erfolgt. Magische Methoden sind am doppelten Unterstrich zu Beginn eines
Bezeichners erkennbar. Obwohl die Funktion erst mit PHP 5 eingeführt wurde, wird von der Verwendung bereits wieder abgeraten
und auf die flexiblere Funktion spl_autoload_register() verwiesen.
spl_autoload_register () akzeptiert als Parameter den Namen einer Funktion und ab PHP 5.3 statt des Namens einer Funktion auch
eine anonyme Funktion, wobei dann die Funktion das eigentliche Laden der Klassen übernimmt. Der Vorteil dürfte sich bei
größeren Projekten zu erkennen geben, insofern nicht alle Klassen in einem gemeinsamen Verzeichnis abgelegt werden.
Autoloading mit der selbstdefinierten Funktion ladeKlasse und
spl_autoload_register:
<?php function ladeKlasse($class) { include strtolower($class).".php"; } spl_autoload_register("ladeKlasse"); ?>Alternative Notation ab PHP 5.3 mit anonymer Funktion:
<?php spl_autoload_register(function($class) { include strtolower($class).".php"; }); ?>
Für kleinere Anwendungen, für die nur wenige Klassen erforderlich sind, dürfte es jedoch weiterhin genügen, die benötigten Klassen der Reihe nach per Include-Anweisungen einzubinden.
Sichtbarkeit und Kapselung « / » ...
Einstieg in PHP
Übersicht
Diverse Themen