Подтвердить что ты не робот

Почему 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);
  }
} 
4b9b3361

Ответ 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);
}