OOP PHP5 - Magische Methoden - autoload
1. Vorwort
Wie ich bei der Einführung zu den magischen Methoden schon sagte, gehört __autoload
zu den Interzeptormethoden. Allerdings
unterscheidet sie sich von den anderen in ihrer Funktionsweise, denn sie wird nur außerhalb(!) von Klassen eingesetzt. Darum gibt es hier
auch einen eigenen Abschnitt dazu.
2. Funktionsweise
Diese Methode wird automatisch aufgerufen, wenn mittels new
ein Objekt aus einer Klasse erzeugt werden soll, letztere
aber zu diesem Zeitpunkt noch nicht vorhanden ist. Es wird nur ein Parameter übergeben. Dabei kann es sich um einen Klassennamen handeln
oder um ein Array, dass mehrere davon beinhaltet. Und wann kann man das einsetzen? Ganz einfach. In der Objektorientierten Programmierung
ist zum Beispiel folgender Grundsatz sehr weit verbreitet.
"Jede Klasse wird in einer eigenen Datei abgespeichert" [Quelle: weit verbreiteter Grundsatz]
Dieses Prinzip wird gerne benutzt, um den Code übersichtlich zu gestalten und den Überblick zu behalten. Darum solltet ihr euch das auch ganz schnell angewöhnen, wenn ihr es noch nicht getan habt.
3. Das Beispiel
Daraus ergibt sich ein Problem. Man müsste jedes Mal alle Klassen über require
oder include
einbinden, was
zu einer waren Sisyphusarbeit ausarten kann. Stattdessen arbeitet man mit __autoload
. Nehmen wir mal unser altes
Beispiel mit Dieter und Dörte, allerdings in extrem verkürzter Form.
// Mensch.php
class Mensch {...}
// Mann.php
class Mann extends Mensch {...}
// Frau.php
class Frau extends Mensch {...}
// bla.php
function __autoload($class)
{
require 'class/'.$class.'.php';
}
$dieter = new Mann;
$doerte = new Frau;
In diesem Fall werden alle benötigten Klassendateien automatisch über require
eingebunden. Vorausgesetzt, dass die
Dateinamen identisch sind mit den Klassenamen und in diesem Fall(!) in einem Ordner namens class
liegen! Also achtet auf die
Groß- und Kleinschreibung. Erstaunlicherweise wird sogar die Mensch.php
eingebunden, da sie über extends
in
die beiden anderen Klassen "integriert" ist.
4. Probleme
Neben einer einheitlichen Benamung der Klassen und Dateien gibt es noch andere Schwierigkeiten. Sollte die entsprechende Datei
nicht gefunden werden, so verabschiedet sich PHP mit einem Fatal
error. Leider kann man das nicht mit der üblichen Fehlerbehandlung abfangen. Selbst mit try ... catch
lässt sich
dieses Problem nicht umgehen.
Ein Hinweis
Das gilt aber nur bis zur Version 5.2.x, ab der 5.3 ist das jetzt möglich. Man muss aber darauf achten, dass wenn man mit einer selbst definierten
Exception um sich schmeißt, deren Klasse bereits verfügbar sein muss. Denn sonst fliegt euch alles um die Ohren. Die Feinheiten dazu findet ihr wie gehabt im
Handbuch. Und was die dortige Erwähnung von spl_autoload_register
angeht, das steht bereits auf meiner Liste, wo es um die Standard PHP Library (SPL) geht.
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt