我怎样才能捕捉到PHPtypes提示“可捕捉的致命错误”?

我试图在我的一个类中实现PHP5的Type Hinting,

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”。 一个“exception”(在吓唬引号中)不是从exception而是从错误中派生的; 它仍然是一个Throwable ,可以用一个正常的try-catch块来处理。 请参阅https://wiki.php.net/rfc/throwable-interface

例如

 <?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。

另见: http : //derickrethans.nl/erecoverableerror.html

例如

 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.'; 

请参阅: http : //docs.php.net/ErrorException