Nell'esempio seguente, se la classe non esiste, voglio rilevare l'errore e creare invece una classe Null
.Perché PHP non rileva un errore "Classe non trovata"?
Ma nonostante le mie dichiarazioni try/catch, PHP mi dice semplicemente Class 'SmartFormasdfasdf' not found
.
Come posso ottenere PHP per rilevare l'errore "classe non trovata"?
<?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();
?>
Soluzione:
Grazie @Mchl, questo è come ho risolto allora:
public static function create($smartFormIdCode) {
$className = 'SmartForm' . $smartFormIdCode;
if(class_exists($className)) {
return new $className($smartFormIdCode);
} else {
return new SmartFormNull($smartFormIdCode);
}
}
ho dimenticato La funzionalità PHP try/get ti aiuta semplicemente a creare la tua gestione delle eccezioni, consentendo di lanciare i tuoi errori, ma di conseguenza non cattura gli stessi errori come in C#/Java. –
Vedere http://www.php.net/manual/en/class.errorexception.php per esempio su come "riscrivere" tutti gli errori (tranne quelli fatali) nelle eccezioni. Inoltre, come suggerito da altri, dal 5.3 potrebbe essere utile utilizzare il caricatore automatico per generare un'eccezione quando non viene trovato un file contenente una determinata classe. – Mchl
@Edward - certamente ti permette di catturare * le eccezioni *, ma quasi tutto ciò che è nativo di PHP non genera eccezioni, solo errori. Puoi ovviare a questo problema definendo il tuo * error_handler * e facendo in modo di lanciare Eccezioni usando ErrorException (vedi http://au.php.net/errorexception e l'esempio lì). Questo cambia facilmente il sistema di errore nativo di PHP in un utile sistema basato su Eccezione che funziona molto bene con throw/try/catch ecc. –