Php 为什么';t抓住一个";“未找到类”;错误?

Php 为什么';t抓住一个";“未找到类”;错误?,php,try-catch,Php,Try Catch,在下面的示例中,如果该类不存在,我希望捕获错误并创建一个Null类 但是,尽管我使用了try/catch语句,PHP还是简单地告诉我,Class'SmartFormasdfasdf'未找到 如何让PHP捕获“未找到类”错误? <?php class SmartFormLogin extends SmartForm { public function render() { echo '<p>this is the login form</p>'

在下面的示例中,如果该类不存在,我希望捕获错误并创建一个
Null

但是,尽管我使用了try/catch语句,PHP还是简单地告诉我,
Class'SmartFormasdfasdf'未找到

如何让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();
?>

因为这是一个致命的错误。使用class_exists()函数检查类是否存在

另外:PHP不是Java—除非重新定义默认错误处理程序,否则它将引发错误而不会引发异常。

在尝试实例化该类之前,您需要使用查看该类是否存在


顺便说一句,如果您使用的是类自动加载程序,请确保将第二个参数设置为true。

因为当您尝试创建不存在的类的新对象时,php会发出致命错误。要使其正常工作,您需要php>=5.3和函数,在这里您应该尝试查找具有类定义的文件或抛出自定义异常。

旧问题,但在PHP7中,这是一个可捕获的异常。尽管我仍然认为,
class\u存在($class)
是一种更明确的方法。但是,您可以使用新的
\Throwable
异常类型执行try/catch块:

$className = 'SmartForm' . $smartFormIdCode;
try {
    return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
    return new SmartFormNull($smartformIdCode);
}
php>=7.0

php可以将“未找到类”捕获为可丢弃

try {
        return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
        return new SmartFormNull($smartformIdCode);
}

我忘了,PHP try/get功能只是通过允许抛出自己的错误来帮助您构建自己的异常处理,但不会像在C#/Java中那样捕获错误本身。请参阅如何将所有(致命)错误“重写”到异常的示例。另外,正如其他人所建议的,由于5.3版,当找不到包含给定类的文件时,您可能希望使用autoloader来引发异常。@Edward-它当然可以让您捕捉异常,但几乎所有PHP本机程序都不会引发异常,只会引发错误。通过定义自己的错误处理程序并使用ErrorException引发异常,您可以轻松解决此问题(请参阅和其中的示例)。这很容易将PHP的本机错误系统切换到一个有用的基于异常的系统,该系统可以很好地与throw/try/catch等一起工作。a)autoload是一种错误的方法,请参见和b)它不需要PHP 5.3。autoloader中的异常确实需要5.3。只要你知道自己在做什么,就没有什么“错误”(即,当自动加载队列中有更多的自动加载程序时抛出异常有点愚蠢)。@El Yobo-你能详细说明一下自动加载的错误吗?spl函数的作用是相同的,唯一的区别是它允许您提供更多的函数来运行以搜索正确的文件。Ans至于b),正如Mchl所说,您仍然需要PHP5.3使其抛出一个异常。或者,如果您想更具体地了解所捕获的内容,您可以捕获\Error类型(在PHP7.1中测试可以工作)。这将使您的代码更容易改变PHP语言的发展方式,但也不太可能捕捉到您不希望它捕捉到的内容。如果您有很好的自动化测试,那么您应该能够获得更具体的版本,因为如果PHP突然开始为此抛出不同的类型,您的测试将失败。谢谢。完美答案。
try {
        return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
        return new SmartFormNull($smartformIdCode);
}