首頁  >  問答  >  主體

改寫標題:為什麼 PHP 不處理「找不到類別」錯誤?

在下面的範例中,如果該類別不存在,我想捕獲錯誤並建立一個 Null 類別。

但儘管我有 try/catch 語句,PHP 只是告訴我 未找到 'SmartFormasdfasdf' 類別

如何讓 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);
  }
}


#
P粉475126941P粉475126941313 天前459

全部回覆(2)我來回復

  • P粉680000555

    P粉6800005552024-01-04 16:54:40

    老問題,但在 PHP7 中這是一個可捕獲的異常。儘管我仍然認為 class_exists($class) 是一種更明確的方法。但是,您可以使用新的 \Throwable 例外類型執行 try/catch 區塊:

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

    回覆
    0
  • P粉810050669

    P粉8100506692024-01-04 15:37:51

    因為這是一個致命錯誤。使用class_exists()函數檢查類別是否存在。

    另外:PHP 不是 Java - 除非您重新定義預設錯誤處理程序,否則它會引發錯誤而不拋出異常。

    回覆
    0
  • 取消回覆