En el siguiente ejemplo, si la clase no existe, quiero detectar el error y crear una clase Null
en su lugar.¿Por qué PHP no detecta un error de "Clase no encontrada"?
Pero a pesar de mis declaraciones try/catch, PHP simplemente me dice Class 'SmartFormasdfasdf' not found
.
¿Cómo puedo obtener PHP para detectar el error de "clase no encontrada"?
<?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();
?>
Solución:
Gracias @Mchl, esto es cómo lo resolví a continuación:
public static function create($smartFormIdCode) {
$className = 'SmartForm' . $smartFormIdCode;
if(class_exists($className)) {
return new $className($smartFormIdCode);
} else {
return new SmartFormNull($smartFormIdCode);
}
}
olvidé La función PHP try/get simplemente lo ayuda a construir su propio manejo de excepciones permitiéndole arrojar sus propios errores, pero no detecta los mismos errores como en C#/Java. –
Consulte http://www.php.net/manual/en/class.errorexception.php, por ejemplo, sobre cómo 'reescribir' todos los errores (excepto los fatales) en excepciones. Además, como otros sugirieron, desde 5.3 es posible que desee utilizar el autocargador para lanzar una excepción cuando no se encuentre un archivo que contenga la clase dada. – Mchl
@Edward - ciertamente le permite capturar * excepciones *, pero casi todo lo nativo de PHP no arroja excepciones, solo errores. Puede solucionar esto fácilmente definiendo su propio * error_handler * y haciendo que arroje Excepciones usando ErrorException (vea http://au.php.net/errorexception y el ejemplo allí). Esto fácilmente cambia el sistema de error nativo de PHP a un sistema basado en Exception que funciona muy bien con throw/try/catch etc. –