Viele Entwickler erstellen beim Schreiben objektorientierter Anwendungen eine PHP-Quelldatei für jede Klassendefinition. Ein großes Ärgernis ist, dass am Anfang jedes Skripts eine lange Liste von Include-Dateien (eine Datei pro Klasse) geschrieben werden muss.
In PHP 5 ist dies nicht mehr notwendig. Sie können eine __autoload()-Funktion definieren, die automatisch aufgerufen wird, wenn versucht wird, eine Klasse zu verwenden, die noch nicht definiert wurde. Durch den Aufruf dieser Funktion hat die Skript-Engine eine letzte Chance, die erforderlichen Klassen zu laden, bevor PHP mit einem Fehler abstürzt.
Tipp
spl_autoload_register() bietet eine flexiblere Möglichkeit, das automatische Laden von Klassen zu implementieren. Daher wird die Verwendung der Funktion __autoload() nicht mehr empfohlen und wird in einer zukünftigen Version möglicherweise nicht mehr unterstützt.
Hinweis:
Vor Version 5.3.0 können von der __autoload-Funktion ausgelöste Ausnahmen nicht vom Catch-Anweisungsblock abgefangen werden und führen zu einem schwerwiegenden Fehler. Ab 5.3.0 können von der Funktion __autoload ausgelöste Ausnahmen vom Anweisungsblock „catch“ abgefangen werden, sie müssen jedoch einer Bedingung folgen. Wenn eine benutzerdefinierte Ausnahme ausgelöst wird, muss eine entsprechende benutzerdefinierte Ausnahmeklasse vorhanden sein. Die Funktion __autoload kann benutzerdefinierte Ausnahmeklassen automatisch rekursiv laden.
Hinweis:
Autoloading ist im interaktiven CLI-Modus von PHP nicht verfügbar.
Beispiel #1 Beispiel für automatisches Laden
In diesem Beispiel wird versucht, MyClass1 und MyClass2 aus den Dateien MyClass1.php bzw. MyClass2.php zu laden:
function __autoload($class_name){ require_once $class_name.'.php'; } $obj = new MyClass1(); $obj2 = new MyClass2();
Hinweis: MyClass1 .php und MyClass2.php müssen sich im selben Verzeichnis wie das aktuelle Skript befinden, um in
Beispiel #2 Ein weiteres Beispiel
Dieses Beispiel versucht, die Schnittstelle ITest zu laden:
function __autoload($name) { var_dump($name); } class Foo implements ITest { } /* string(5) "ITest" Fatal error: Interface 'ITest' not found in ... */
Beispiel #3 Automatische Lade-Ausnahmebehandlung in PHP 5.3.0
Dieses Beispiel löst eine Ausnahme aus und demonstriert sie im try/catch-Anweisungsblock.
function __autoload($name) { echo "Want to load $name.\n"; throw new Exception("Unable to load $name."); } try { $obj = new NonLoadableClass(); } catch (Exception $e) { echo $e->getMessage(), "\n"; }
Die obige Routine gibt Folgendes aus:
Möchten Sie NonLoadableClass laden.
NonLoadableClass kann nicht geladen werden.
Beispiel #4 Automatisches Laden in PHP 5.3.0 Ausnahmebehandlung in – kein benutzerdefinierter Ausnahmemechanismus
Dieses Beispiel löst eine Ausnahme für eine benutzerdefinierte Ausnahmebehandlungsfunktion aus, die nicht vorhanden ist.
Die obige Routine gibt Folgendes aus:
Möchte NonLoadableClass laden.
Möchte MissingException laden.
Schwerwiegender Fehler: Klasse 'MissingException' nicht in testMissingException.php gefunden online 4