Im folgenden Beispiel, wenn die Klasse nicht existiert, möchte ich den Fehler abfangen und stattdessen eine Null
Klasse erstellen.Warum fängt PHP nicht den Fehler "Klasse nicht gefunden" ab?
Aber trotz meiner Versuch/catch Aussagen, PHP sagt mir einfach Class 'SmartFormasdfasdf' not found
.
Wie bekomme ich PHP, um den Fehler 'Klasse nicht gefunden' zu verstehen?
<?php
class SmartFormLogin extends SmartForm {
public function render() {
echo '<p>this is the login form</p>';
}
}
class SmartFormCodeWrapper extends SmartForm {
public function render() {
echo '<p>this is the code wrapper form</p>';
}
}
class SmartFormNull extends SmartForm {
public function render() {
echo '<p>the form "' . htmlentities($this->idCode) . '" does not exist</p>';
}
}
class SmartForm {
protected $idCode;
public function __construct($idCode) {
$this->idCode = $idCode;
}
public static function create($smartFormIdCode) {
$className = 'SmartForm' . $smartFormIdCode;
try {
return new $className($smartFormIdCode);
} catch (Exception $ex) {
return new SmartFormNull($smartformIdCode);
}
}
}
$formLogin = SmartForm::create('Login');
$formLogin->render();
$formLogin = SmartForm::create('CodeWrapper');
$formLogin->render();
$formLogin = SmartForm::create('asdfasdf');
$formLogin->render();
?>
Lösung:
Dank @Mchl, das ist, wie ich es gelöst dann:
public static function create($smartFormIdCode) {
$className = 'SmartForm' . $smartFormIdCode;
if(class_exists($className)) {
return new $className($smartFormIdCode);
} else {
return new SmartFormNull($smartFormIdCode);
}
}
ich vergessen , PHP try/get-Funktion hilft Ihnen nur beim Erstellen Ihrer eigenen Ausnahmebehandlung, indem es Ihnen ermöglicht, Ihre eigenen Fehler zu werfen, aber nicht konsequent Fehler wie in C#/Java. –
Siehe http://www.php.net/manual/en/class.errorexception.php zum Beispiel wie man alle (außer fatalen) Fehler in Ausnahmen umschreibt. Wie bereits erwähnt, möchten Sie ab Version 5.3 den Autoloader verwenden, um eine Ausnahme auszulösen, wenn eine Datei mit der angegebenen Klasse nicht gefunden wird. – Mchl
@Edward - es lässt Sie sicher * Ausnahmen * fangen, aber fast alles native in PHP wirft keine Ausnahmen, nur Fehler. Sie können dies leicht umgehen, indem Sie Ihren eigenen * error_handler * definieren und Exceptions mit ErrorException auslösen (siehe http://au.php.net/errorexception und das Beispiel dort). Dies verwandelt das native Fehlersystem von PHP leicht in ein nützliches Exception-basiertes System, das ganz gut mit throw/try/catch usw. funktioniert. –