Почему PHP не ловит ошибку «Класс не найден»? - PullRequest
25 голосов
/ 12 декабря 2010

В следующем примере, если класс не существует, я хочу отловить ошибку и создать вместо нее класс 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();
?>

Решение:

Спасибо @Мчл, вот как я решил это тогда:

public static function create($smartFormIdCode) {
  $className = 'SmartForm' . $smartFormIdCode;
  if(class_exists($className)) {
    return new $className($smartFormIdCode);
  } else {
    return new SmartFormNull($smartFormIdCode);
  }
} 

Ответы [ 5 ]

44 голосов
/ 12 декабря 2010

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

Также: PHP не является Java - если вы не переопределите обработчик ошибок по умолчанию, он вызовет ошибки, а не вызовет исключения.

23 голосов
/ 24 декабря 2015

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

$className = 'SmartForm' . $smartFormIdCode;
try {
    return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
    return new SmartFormNull($smartformIdCode);
}
5 голосов
/ 12 декабря 2010

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

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

4 голосов
/ 04 сентября 2017

php> = 7.0

php может поймать 'класс не найден' как Throwable

try {
        return new $className($smartFormIdCode);
} catch (\Throwable $ex) {
        return new SmartFormNull($smartformIdCode);
}
0 голосов
/ 12 декабря 2010

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

...