Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

OOP: Vererbung und Autoloading von Klassen

Vererbung von Eigenschaften und Methoden - Teil II

Übersicht / Seite:

  1. Einführung (in die objektorientierte Programmierung)
  2. Sichtbarkeit (und Kapselung von Eigenschaften und Methoden)
  3. Vererbung (von Eigenschaften und Methoden sowie Autoload von Klassen)
  4. Konstruktoren und Destruktoren (Methoden zum Erzeugen und Auflösen)
  5. Beispiele (eine simple Parserklasse, eine TCP/IP Socket Klasse und mehr ...)

Reihenfolge bei der Vererbung

Das Prinzip der Vererbung wurde auf der vorausgehenden Seite bereits vorgestellt. Elternklassen und Kinderklassen können voneinander entsprechend ihrem ver­wandt­schaftlichen 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üssel­wort 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 Reihen­folge 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

Autoloading von Klassen

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 Auto­loading 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 « / » ...

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen