次の例では、クラスが存在しない場合、エラーをキャッチして、代わりにNull
クラスを作成します。
しかし、私のtry/catchステートメントにもかかわらず、PHPは単にClass 'SmartFormasdfasdf' not found
。
「クラスが見つかりません」エラーをキャッチするためにPHPを取得するにはどうすればよいですか?
<?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);
}
}
致命的なエラーだからです。 class_exists()関数を使用して、クラスが存在するかどうかを確認します。
また、PHPはJavaではありません-デフォルトのエラーハンドラを再定義しない限り、エラーが発生し、例外がスローされません。
古い質問ですが、PHP7ではこれはキャッチ可能な例外です。私はまだclass_exists($class)
がそれを行うためのより明確な方法だと思いますが。ただし、新しい\Throwable
例外タイプを使用して、try/catchブロックを実行できます。
$className = 'SmartForm' . $smartFormIdCode;
try {
return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
return new SmartFormNull($smartformIdCode);
}
クラスをインスタンス化する前に、 class_exists を使用してクラスが存在するかどうかを確認する必要があります。
ちなみに、クラスオートローダーを使用している場合は、必ず2番目の引数をtrueに設定してください。
php> = 7.0
phpは「クラスが見つかりません」をThrowableとしてキャッチできます
try {
return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
return new SmartFormNull($smartformIdCode);
}
存在しないクラスの新しいオブジェクトを作成しようとすると、phpは致命的なエラーを発行するためです。それを機能させるには、php> = 5.3および autoload 関数が必要です。ここで、クラス定義のあるファイルを探すか、カスタム例外をスローする必要があります。