autoload()

Aus php bar
Wechseln zu: Navigation, Suche

__autoload()

Die Funktion __autoload() wird von der Engine aufgerufen wenn über den new-Operator eine Klasse instanziert werden soll, deren Definition noch nicht geladen wurde. Die Engine übergibt dabei als einzigen Parameter den Namen der gewünschten Klasse. Nach dem Ausführen der Funktion soll die benötigte Klasse zur Verfügung stehen.


Beispiel

1 span class="st0">'classes/''.php';
2 }
3 
4 // aufruf durch new
5 // aufruf durch class_exists()
6 'Bar'


Fehlerbehandlung in __autoload()

Eine wirkliche Fehlerbehandlung in __autoload() ist nicht möglich - wenn nach dem Ausführen der Funktion die Klasse nicht zur Verfügung steht beendet PHP die Skriptausführung mit einem Fatal Error. Zu selbigem führt auch der Versuch eine Exception zu werfen. In der Regel will man einen solchen Fehler abfangen ohne dass die Anwendung sofort beendet wird. Dies geht nur mit einem Work-Around, der z. B. mit eval() eine Klasse mit dem richtigen Namen zur Verfügung stellt, die ihrerseits im Konstruktor eine Exception wirft. Eine mögliche Implementierung könnte so aussehen:

 span class="co1">// Fehlerunterdrückung mittels @
 '.php';
 
     // Überprüfung ob Klasse erzeugt wurde
     // der zweite Parameter zu class_exists ist wichtig
     // sonst wird __autoload() rekursiv ausgeführt!
 // Wenn die Klasse nicht existiert müssen wir sie
         // uns selber erstellen um den Fatal Error zu umgehen:
 'class ' . $name . ' { ' .
10              '    public function __construct() { ' .
11              '        throw new Exception("Class ' . $name . ' not found."); ' .
12              '    } ' .
13              '} '// Versuch die (nicht existierende) Klasse bar zu instanzieren
14 // Klasse nicht gefunden...
15 }


Allgemeine Probleme im Umfeld von __autoload()

Neben dem Vorteil nicht mehr alle includes an den Anfang der Datei zu schreiben führt der Einsatz von __autoload() unter Umständen aber auch zu Problemen:

  • In einem Programm kann es nur eine __autoload() geben, folglich ist es nicht möglich ein Framework, das auf __autoload() basiert, mit eigenem Code Code eines anderen Frameworks zu verwenden, der ebenfalls __autoload() verwendet. Einen Ausweg bietet hier das Verwenden der Funktion spl_autoload_register, die das Verwalten beliebiger Autoload-Klassen unterstützt.


Links

  • PHP Autoloader - Eine Implementierung die selbstständig Klassendefinitionen findet.