次の例では、クラスが存在しない場合、エラーをキャッチして代わりにNull
クラスを作成します。PHPが「クラスが見つかりません」というエラーをキャッチしないのはなぜですか?
私のtry/catchステートメントにもかかわらず、PHPは単にClass 'SmartFormasdfasdf' not found
を教えてくれます。
「クラスが見つかりません」というエラーをキャッチするにはどうすればよいですか?
<?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();
?>
ソリューション:
おかげ@Mchl、これは私がそれを解決する方法である:
public static function create($smartFormIdCode) {
$className = 'SmartForm' . $smartFormIdCode;
if(class_exists($className)) {
return new $className($smartFormIdCode);
} else {
return new SmartFormNull($smartFormIdCode);
}
}
として 'クラスが見つかりません' PHPのtry/get機能は、独自のエラーをスローすることで独自の例外処理を構築するのに役立ちますが、C#/ Javaのようにエラー自体を捕捉することはありません。 –
すべての(致命的なエラーを除く)エラーを例外に「書き換える」方法の例については、http://www.php.net/manual/en/class.errorexception.phpを参照してください。また、5.3より、指定されたクラスを含むファイルが見つからないときにオートローダーを使用して例外をスローすることもできます。 – Mchl
@Edward - 例外的に*例外を捕まえることはできますが、PHPにネイティブなものはほとんどすべて例外をスローしません。独自の* error_handler *を定義し、ErrorExceptionを使用して例外をスローすることで簡単に回避できます(http://au.php.net/errorexceptionとその例を参照)。これは、PHPのネイティブエラーシステムを、スロー/トライ/キャッチなどでうまく動作する便利な例外ベースのシステムに簡単に切り替えます。 –