Cập nhật: Đây không phải là một lỗi nghiêm trọng có thể mắc phải nữa trong php 7. Thay vào đó, một "ngoại lệ" được ném ra. Một "ngoại lệ" (trong dấu ngoặc kép) không có nguồn gốc từ Exception mà là Error ; nó vẫn là một Throwable và có thể được xử lý bằng một khối try-catch thông thường. xem https://wiki.php.net/rfc/throwable-interface
Ví dụ
<?php
class ClassA {
public function method_a (ClassB $b) { echo 'method_a: ', get_class($b), PHP_EOL; }
}
class ClassWrong{}
class ClassB{}
class ClassC extends ClassB {}
foreach( array('ClassA', 'ClassWrong', 'ClassB', 'ClassC') as $cn ) {
try{
$a = new ClassA;
$a->method_a(new $cn);
}
catch(Error $err) {
echo "catched: ", $err->getMessage(), PHP_EOL;
}
}
echo 'done.';
bản in
catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassA given, called in [...]
catched: Argument 1 passed to ClassA::method_a() must be an instance of ClassB, instance of ClassWrong given, called in [...]
method_a: ClassB
method_a: ClassC
done.
Câu trả lời cũ cho các phiên bản trước php7:
http://docs.php.net/errorfunc.constants cho biết:
E_RECOVERABLE_ERROR (số nguyên)
Lỗi nghiêm trọng có thể bắt được. Nó chỉ ra rằng một lỗi có thể nguy hiểm đã xảy ra, nhưng không khiến Động cơ ở trạng thái không ổn định. Nếu lỗi không được phát hiện bởi một xử lý do người dùng xác định (xem thêm set_error_handler () ), ứng dụng sẽ hủy bỏ vì nó là một E_ERROR.
xem thêm: http://derickrethans.nl/erecoverableerror.html
ví dụ
function myErrorHandler($errno, $errstr, $errfile, $errline) {
if ( E_RECOVERABLE_ERROR===$errno ) {
echo "'catched' catchable fatal error\n";
return true;
}
return false;
}
set_error_handler('myErrorHandler');
class ClassA {
public function method_a (ClassB $b) {}
}
class ClassWrong{}
$a = new ClassA;
$a->method_a(new ClassWrong);
echo 'done.';
bản in
'catched' catchable fatal error
done.
chỉnh sửa: Nhưng bạn có thể "biến" nó thành một ngoại lệ mà bạn có thể xử lý bằng khối try-catch
function myErrorHandler($errno, $errstr, $errfile, $errline) {
if ( E_RECOVERABLE_ERROR===$errno ) {
echo "'catched' catchable fatal error\n";
throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
// return true;
}
return false;
}
set_error_handler('myErrorHandler');
class ClassA {
public function method_a (ClassB $b) {}
}
class ClassWrong{}
try{
$a = new ClassA;
$a->method_a(new ClassWrong);
}
catch(Exception $ex) {
echo "catched\n";
}
echo 'done.';
xem: http://docs.php.net/ErrorException
E_RECOVERABLE_ERROR
) vì đây được đánh bắt đầu với PHP 7 ..