Hauptmenü

Untermenü

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