ser - ¿Cómo puedo detectar un "error fatal capturable" en la sugerencia de tipo de PHP?
type hinting php (1)
Estoy tratando de implementar Type Hinting of PHP5 en uno de mi clase,
class ClassA {
public function method_a (ClassB $b)
{}
}
class ClassB {}
class ClassWrong{}
Uso Correcto:
$a = new ClassA;
$a->method_a(new ClassB);
produciendo error:
$a = new ClassA;
$a->method_a(new ClassWrong);
Error fatal capturable: el argumento 1 pasó a ClassA :: method_a () debe ser una instancia de ClassB, instancia de ClassWrong dada ...
¿Puedo saber si es posible detectar ese error (ya que dice "atrapable")? y si es así, ¿cómo?
Gracias.
Actualización: ya no se trata de un error fatal que se puede atrapar en php 7. En su lugar, se lanza una "excepción". Una "excepción" (en citas de susto) que no se deriva de Exception sino Error ; sigue siendo un Throwable y se puede manejar con un bloque try-catch normal. ver https://wiki.php.net/rfc/throwable-interface
P.ej
<?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.'';
huellas dactilares
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.
Respuesta anterior para versiones pre-php7:
http://docs.php.net/errorfunc.constants dice:
E_RECOVERABLE_ERROR (entero)
Error fatal capturable. Indica que se produjo un error probablemente peligroso, pero que no dejó el motor en un estado inestable. Si el error no es capturado por un identificador definido por el usuario (ver también set_error_handler() ), la aplicación aborta ya que era un E_ERROR.
ver también: http://derickrethans.nl/erecoverableerror.html
p.ej
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.'';
huellas dactilares
''catched'' catchable fatal error
done.
editar: pero puedes "convertirlo" en una excepción que puedes manejar con un bloque 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.'';