Trong ví dụ sau, nếu lớp không tồn tại, tôi muốn bắt lỗi và tạo ra một lớp Null
thay thế.Tại sao PHP không gặp lỗi "Không tìm thấy lớp"?
Nhưng mặc dù các câu lệnh try/catch của tôi, PHP chỉ đơn giản là cho tôi biết Class 'SmartFormasdfasdf' not found
.
Làm cách nào để nhận được PHP để bắt lỗi 'không tìm thấy lớp'?
<?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();
?>
Giải pháp:
Cảm ơn @Mchl, đây là cách tôi giải quyết nó thì:
public static function create($smartFormIdCode) {
$className = 'SmartForm' . $smartFormIdCode;
if(class_exists($className)) {
return new $className($smartFormIdCode);
} else {
return new SmartFormNull($smartFormIdCode);
}
}
Tôi quên , PHP try/get tính năng chỉ giúp bạn xây dựng xử lý ngoại lệ của riêng bạn bằng cách cho phép bạn để ném lỗi của riêng bạn, nhưng không do đó bắt lỗi chính nó như trong C#/Java. –
Xem http://www.php.net/manual/en/class.errorexception.php ví dụ về cách 'viết lại' tất cả (trừ trường hợp tử vong) cho các ngoại lệ. Ngoài ra, như đề nghị khác, kể từ 5,3 bạn có thể muốn sử dụng tự động tải để ném một ngoại lệ khi một tập tin có chứa lớp nhất định không được tìm thấy. – Mchl
@Edward - nó chắc chắn cho phép bạn bắt * ngoại lệ *, nhưng hầu hết mọi thứ có nguồn gốc từ PHP không ném ngoại lệ, chỉ là lỗi. Bạn có thể làm việc xung quanh điều này một cách dễ dàng bằng cách định nghĩa error_handler * của riêng bạn và có ném các ngoại lệ bằng cách sử dụng ErrorException (xem http://au.php.net/errorexception và ví dụ ở đó). Điều này dễ dàng chuyển đổi hệ thống lỗi gốc của PHP thành một hệ thống dựa trên Ngoại lệ hữu ích hoạt động khá độc đáo với việc ném/thử/bắt, v.v. –