Я пытаюсь реализовать Type Hinting 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);
Обрезаемая фатальная ошибка: аргумент 1, переданный ClassA :: method_a (), должен быть экземпляром ClassB, экземпляр ClassWrong, данный …
Могу ли я узнать, можно ли поймать эту ошибку (так как она говорит «захватывающе»)? и если да, то как?
Спасибо.
Обновление: в php 7. Это больше не опасная фатальная ошибка. Вместо этого возникает «исключение». «Исключение» (в кавычках), которое не является производным от Exception, а Error ; он по-прежнему является 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.
Старый ответ для версий pre-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.
edit: Но вы можете «сделать» это исключение, с которым вы можете справиться с блоком 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.';