在下面的示例中,如果该类不存在,我想捕获错误并改为创建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);
}
}
答案 0 :(得分:44)
因为这是一个致命的错误。使用class_exists()函数检查类是否存在。
另外:PHP不是Java - 除非你重新定义了默认错误处理程序,否则会引发错误而不会抛出异常。
答案 1 :(得分:21)
老问题,但在PHP7中,这是一个可捕获的异常。虽然我仍然认为class_exists($class)
是一种更明确的方式。但是,您可以使用新的\Throwable
异常类型执行try / catch块:
$className = 'SmartForm' . $smartFormIdCode;
try {
return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
return new SmartFormNull($smartformIdCode);
}
答案 2 :(得分:5)
在尝试实例化之前,您需要使用class_exists来查看该类是否存在。
顺便提一下,如果您使用的是类自动加载器,请务必将第二个arg设置为true。
答案 3 :(得分:4)
php&gt; = 7.0
php可以将'找不到的课'捕获为Throwable
try {
return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
return new SmartFormNull($smartformIdCode);
}
答案 4 :(得分:0)
因为当您创建非现有类的新对象时,php会发出致命错误。要使它工作,你需要php&gt; = 5.3和autoload函数,你应该尝试查找带有类定义的文件或抛出自定义异常。