Mise à jour: Ce n'est plus une erreur fatale capturable dans php 7. Au lieu de cela, une "exception" est lancée. Une "exception" (entre guillemets effrayants) qui n'est pas dérivée d'une exception mais d'une erreur ; c'est toujours un Throwable et peut être manipulé avec un bloc try-catch normal. voir https://wiki.php.net/rfc/throwable-interface
Par exemple
<?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.';
impressions
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.
Ancienne réponse pour les versions pré-php7:
http://docs.php.net/errorfunc.constants dit:
E_RECOVERABLE_ERROR (entier)
Erreur fatale capturable. Cela indique qu'une erreur probablement dangereuse s'est produite, mais n'a pas laissé le moteur dans un état instable. Si l'erreur n'est pas interceptée par un handle défini par l'utilisateur (voir aussi set_error_handler () ), l'application abandonne car il s'agissait d'un E_ERROR.
voir aussi: http://derickrethans.nl/erecoverableerror.html
par exemple
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.';
impressions
'catched' catchable fatal error
done.
edit: Mais vous pouvez "en faire" une exception que vous pouvez gérer avec un bloc 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.';
voir: http://docs.php.net/ErrorException
E_RECOVERABLE_ERROR
) discutée ici, car elles doivent être détectées à partir de PHP 7.