Почему PHP не поймает ошибку «Класс не найден»?

В следующем примере, если класс не существует, я хочу поймать ошибку и создать вместо Null класс Null .

Но, несмотря на мои утверждения try / catch, PHP просто говорит, что Class 'SmartFormasdfasdf' not found .

Как я могу заставить PHP поймать ошибку «class 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); } } 

Потому что это фатальная ошибка. Используйте функцию class_exists (), чтобы проверить, существует ли класс.

Кроме того: PHP не является Java – если вы не переопределили обработчик ошибок по умолчанию, он будет вызывать ошибки и не генерировать исключения.

Старый вопрос, но в PHP7 это захватывающее исключение. Хотя я все еще думаю, что class_exists($class) является более явным способом сделать это. Однако вы можете сделать блок try / catch, используя новый \Throwable исключения \Throwable :

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

Вам нужно использовать class_exists, чтобы узнать, существует ли класс, прежде чем пытаться его создать.

Кстати, если вы используете автозагрузчик класса, обязательно установите для второго аргумента значение true.

Поскольку php испускает фатальную ошибку, когда вы создаете новый объект не существующего класса. Чтобы заставить его работать, вам понадобятся php> = 5.3 и функция автозагрузки , где вы должны попытаться найти файл с определением класса или выбросить собственное исключение.

php> = 7,0

php может уловить «класс не найден» как Throwable

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