web-dev-qa-db-ja.com

PHP「クラスが見つかりません」エラーをキャッチしないのはなぜですか?

次の例では、クラスが存在しない場合、エラーをキャッチして、代わりにNullクラスを作成します。

しかし、私のtry/catchステートメントにもかかわらず、PHPは単にClass 'SmartFormasdfasdf' not found

「クラスが見つかりません」エラーをキャッチするために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();
?>

解決:

@Mchlに感謝します、これが私がそれを解決した方法です:

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

致命的なエラーだからです。 class_exists()関数を使用して、クラスが存在するかどうかを確認します。

また、PHPはJavaではありません-デフォルトのエラーハンドラを再定義しない限り、エラーが発生し、例外がスローされません。

44
Mchl

古い質問ですが、PHP7ではこれはキャッチ可能な例外です。私はまだclass_exists($class)がそれを行うためのより明確な方法だと思いますが。ただし、新しい\Throwable例外タイプを使用して、try/catchブロックを実行できます。

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

クラスをインスタンス化する前に、 class_exists を使用してクラスが存在するかどうかを確認する必要があります。

ちなみに、クラスオートローダーを使用している場合は、必ず2番目の引数をtrueに設定してください。

5
John Parker

php> = 7.0

phpは「クラスが見つかりません」をThrowableとしてキャッチできます

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

存在しないクラスの新しいオブジェクトを作成しようとすると、phpは致命的なエラーを発行するためです。それを機能させるには、php> = 5.3および autoload 関数が必要です。ここで、クラス定義のあるファイルを探すか、カスタム例外をスローする必要があります。

0