Почему PHP не поймает ошибку "Класс не найден"?
В следующем примере, если класс не существует, я хочу поймать ошибку и создать класс 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);
}
}
Ответы
Ответ 1
Потому что это фатальная ошибка. Используйте функцию class_exists(), чтобы проверить, существует ли класс.
Также: PHP не является Java - если вы не переопределили обработчик ошибок по умолчанию, он будет вызывать ошибки и не генерировать исключения.
Ответ 2
Старый вопрос, но в PHP7 это захватывающее исключение. Хотя я все еще думаю, что class_exists($class)
- более явный способ сделать это. Однако вы можете сделать блок try/catch, используя новый тип исключения \Throwable
:
$className = 'SmartForm' . $smartFormIdCode;
try {
return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
return new SmartFormNull($smartformIdCode);
}
Ответ 3
Вам нужно использовать class_exists, чтобы узнать, существует ли класс, прежде чем пытаться его создать.
Кстати, если вы используете автозагрузчик класса, обязательно установите для второго аргумента значение true.
Ответ 4
Поскольку php испускает фатальную ошибку, когда вы создаете новый объект из не существующего класса. Чтобы заставить его работать, вам понадобятся php >= 5.3 и autoload, где вы должны попытаться найти файл с определением класса или бросить пользовательское исключение.
Ответ 5
php >= 7.0
php может ловить "класс не найден" как Throwable
try {
return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
return new SmartFormNull($smartformIdCode);
}