我正在尝试在我的一个课程中实现PHP5的类型提示,
class ClassA { public function method_a (ClassB $b) {} } class ClassB {} class ClassWrong{}
正确用法:
$a = new ClassA; $a->method_a(new ClassB);
产生错误:
$a = new ClassA; $a->method_a(new ClassWrong);
可捕获的致命错误:传递给ClassA :: method_a()的参数1必须是ClassB的实例,给定ClassWrong的实例…
是否有可能捕获到该错误(因为它说“可捕获”)?如果是的话,如何?
更新:这不再是php 7中可捕获的致命错误。相反,抛出了“异常”。不是从Exception而是Error派生的“exception”(用引号引起来);它仍然是Throwable,可以使用常规的try-catch块进行处理
例如
<?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.';
版画
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.
php7之前版本的旧答案: http : //docs.php.net/errorfunc.constants 说:
E_RECOVERABLE_ERROR(整数) 可捕获的致命错误。它表明发生了可能是危险的错误,但没有使引擎处于不稳定状态。如果错误未由用户定义的句柄捕获另请参见[set_error_handler(),则应用程序将中止,因为它是E_ERROR。
E_RECOVERABLE_ERROR(整数)
可捕获的致命错误。它表明发生了可能是危险的错误,但没有使引擎处于不稳定状态。如果错误未由用户定义的句柄捕获另请参见[set_error_handler(),则应用程序将中止,因为它是E_ERROR。
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.';
'catched' catchable fatal error done.
编辑:但是您可以“使其”成为您可以使用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.';