Update: Dies ist in PHP 7 kein schwerwiegender Fehler mehr. Stattdessen wird eine "Ausnahme" ausgelöst. Eine „Ausnahme“ (in Schrecken Anführungszeichen) , die nicht von abgeleiteter Ausnahme aber Fehlern ; Es ist immer noch ein Throwable und kann mit einem normalen Try-Catch-Block gehandhabt werden. Siehe https://wiki.php.net/rfc/throwable-interface
Z.B
<?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.';
druckt
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.
Alte Antwort für Pre-PHP7-Versionen:
http://docs.php.net/errorfunc.constants sagt:
E_RECOVERABLE_ERROR (Ganzzahl)
Fangender schwerwiegender Fehler. Es zeigt an, dass ein wahrscheinlich gefährlicher Fehler aufgetreten ist, der Motor jedoch nicht in einem instabilen Zustand belassen wurde. Wenn der Fehler nicht von einem benutzerdefinierten Handle abgefangen wird (siehe auch set_error_handler () ), wird die Anwendung abgebrochen, da es sich um ein E_ERROR handelt.
Siehe auch: http://derickrethans.nl/erecoverableerror.html
z.B
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.';
druckt
'catched' catchable fatal error
done.
edit: Aber du kannst es zu einer Ausnahme machen, die du mit einem Try-Catch-Block behandeln kannst
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.';
Siehe: http://docs.php.net/ErrorException
E_RECOVERABLE_ERROR
), da diese ab PHP 7