Question

Je suis en train de mettre en œuvre de type hinting de PHP5 sur un de ma classe,

class ClassA {
    public function method_a (ClassB $b)
    {}
}

class ClassB {}
class ClassWrong{}

Utilisation correcte:

$a = new ClassA;
$a->method_a(new ClassB);

production d'erreur:

$a = new ClassA;
$a->method_a(new ClassWrong);
  

Catchable erreur fatale: Argument 1 passé à ClassA :: method_a () doit être une instance de ClassB, instance de ClassWrong donné ...

Puis-je savoir s'il est possible de rattraper cette erreur (car il dit « capturables »)? et si oui, comment?

Merci.

Était-ce utile?

La solution

Mise à jour: Ce n'est pas une erreur fatale capturables plus en php 7. Au lieu d'une « exception » est levée. Une "exception" (entre guillemets de peur) qui ne provient pas de Exception mais erreur ; il est encore de 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)
Catchable erreur fatale. Il indique qu'une erreur est survenue probablement dangereuse, mais n'a pas quitté le moteur dans un état instable. Si l'erreur ne se coince pas une poignée définie par l'utilisateur (voir aussi set_error_handler () ), l'application avorte comme il était 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 "faire" une exception, vous pouvez manipuler 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top