Próbuję zaimplementować podpowiedzi typu PHP5 na jednej z moich klas,
class ClassA {
public function method_a (ClassB $b)
{}
}
class ClassB {}
class ClassWrong{}
Prawidłowa obsługa:
$a = new ClassA;
$a->method_a(new ClassB);
powodując błąd:
$a = new ClassA;
$a->method_a(new ClassWrong);
Przechwycony błąd krytyczny: Argument 1 przekazany do ClassA :: method_a () musi być instancją klasy ClassB, podano instancję klasy ClassWrong ...
Czy można wyłapać ten błąd (ponieważ jest napisane „złapalny”)? a jeśli tak, to jak?
php
fatal-error
type-hinting
hoball
źródło
źródło
E_RECOVERABLE_ERROR
), ponieważ są one przechwytywane począwszy od PHP 7 ..Odpowiedzi:
Aktualizacja: To nie jest już możliwy do złapania błąd krytyczny w php 7. Zamiast tego wyrzucany jest „wyjątek”. „Wyjątek” (w cudzysłowie), który nie pochodzi od wyjątku, lecz od błędu ; nadal jest to przedmiot do rzucania i można go obsługiwać zwykłym blokiem try-catch. zobacz https://wiki.php.net/rfc/throwable-interface
Na przykład
<?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.';
wydruki
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.
Stara odpowiedź dla wersji pre-php7:
http://docs.php.net/errorfunc.constants mówi:
zobacz także: http://derickrethans.nl/erecoverableerror.html
na przykład
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.';
wydruki
'catched' catchable fatal error done.
edycja: Ale możesz "uczynić" to wyjątkiem, który możesz obsłużyć za pomocą bloku 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.';
zobacz: http://docs.php.net/ErrorException
źródło