Hallo Zusammen,
Beispiel #3 von
http://php.net/manual/de/language.oop5.autoload.php funktioniert natürlich in diesem Beispiel.
Code:
function __autoload($name) {
echo "Möchte $name laden.\n";
throw new Exception("Kann $name nicht laden.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
Ausgabe: Möchte NonLoadableClass laden. Kann NonLoadableClass nicht laden.
Aber wenn ich den Aufruf ändere und z.B. eine statische Methode aufrufe, kommt ein Fataler Error.
Code:
function __autoload($name) {
echo "Möchte $name laden.\n";
throw new Exception("Kann $name nicht laden.");
}
try {
NonLoadableClass::Methode();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}
Ausgabe: Fatal error: Class 'NonLoadableClass' not found in File on line X
Hier bricht der Code mit Fatal error ab und führt nichtmal mehr eine Shutdown-Funktion aus.
Lasse ich in dem Fall hingegen das throw new weg, führt er eine eventuell vorhandene Shutdown-Funktion aus, bricht aber dann auch bei "new Class" ab und wirft halt keine Ausnahme mehr.
Fragen:
Ist die Autoload Funktion nicht korrekt, um bei Class::Methode() die Klasse noch zu laden, sondern nur bei $obj = new Class; ?
Lässt sich das Problem lösen? (abgesehen davon, kein Autoload zu verwenden oder das ganze mit die() in der Autoloadfunktion abzubrechen, wenn z.B. die Datei und Klasse nicht gefunden wird).
Edit:
In dem Beispiel wird die Ausnahme ja als Beispiel geworfen. Ich würde sie werfen, wenn z.B. die Datei nicht gefunden wird.
Aber funktioniert ja nicht bei Class::Methode()
Zum Beispiel:
Code:
if(!file_exists($strFilename))
throw new \Exception("Die Datei $strFilename existiert nicht.");
include_once($strFilename);
Danke für eure Hilfe.
Grüße
Pascal