Tajuk perkataan semula: Mengapa PHP tidak mengendalikan ralat "kelas tidak ditemui"?
P粉475126941
P粉475126941 2024-01-03 19:53:41
0
2
491

Dalam contoh di bawah, saya ingin menangkap ralat dan mencipta kelas Null jika kelas itu tidak wujud.

Tetapi walaupun kenyataan cuba/tangkap saya, PHP hanya memberitahu saya 未找到 'SmartFormasdfasdf' 类 .

Bagaimana untuk membuat PHP menangkap ralat "Kelas Tidak Ditemui"?

<?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();
?>

Penyelesaian:

Terima kasih @Mchl, beginilah cara saya menyelesaikannya:

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


P粉475126941
P粉475126941

membalas semua(2)
P粉680000555

Soalan lama, tetapi dalam PHP7 ini adalah pengecualian yang boleh ditangkap. Walaupun saya masih fikir class_exists($class) ialah pendekatan yang lebih eksplisit. Walau bagaimanapun, anda boleh melaksanakan blok cuba/tangkap menggunakan Throwable jenis pengecualian baharu:

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

Kerana ini adalah kesilapan yang membawa maut. Gunakan fungsi class_exists() untuk menyemak sama ada kelas wujud.

Juga: PHP bukan Java - ia menimbulkan ralat tanpa membuang pengecualian melainkan anda mentakrifkan semula pengendali ralat lalai.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan