¿Qué ocurre si call_user_func se supone que devuelve false?

Se supone que la función que estoy llamando con call_user_func devuelve FALSE. Entonces, ¿cómo puedo detectar errores si el invocable no es válido?

(Nota al margen: ¿Por qué no hicieron que esto arrojara una excepción en lugar de devolver un código de error? ¿O hay una forma de “atrapar” errores? Tengo un error de manejo. ¿Debo hacer que arroje excepciones para mí?)

Si desea verificar si realmente existe la función o el método para llamar, puede usar is_callable antes de llamar a call_user_func . Puede envolver todo en una función para su fácil reutilización:

 function call_uf($fn) { if(is_callable($fn)) { return call_user_func($fn); } else { throw new Exception("$fn is not callable"); } } 

Preguntaste en un comentario sobre por qué PHP genera errores en lugar de usar excepciones. Creo que es porque las excepciones se introdujeron solo en PHP5, por lo que la mayoría de las funciones de PHP se basan en informes de errores. Parece que hay una forma de evitarlo, ya que el manual indica:

Las funciones internas de PHP utilizan principalmente informes de errores , solo las extensiones modernas orientadas a objetos usan excepciones. Sin embargo, los errores se pueden traducir simplemente a excepciones con ErrorException .

No lanzaron Exception porque necesitan mantener esta función compatible con versiones anteriores. No hubo excepción en las versiones anteriores de PHP, PHP <5.

El tipo de retorno booleano se “reservó” para el informe de falla de función. Lo que debe hacer es descubrir por qué fallaría la función. Supongo que la única razón por la que fallaría es por argumentos inválidos.

Tal vez envolverlo en una llamada segura haría lo que quieras:

 function safe_call_user_func() { $nargs = func_num_args(); $args = func_get_args(); if ( $nargs == 0 ) throw new RuntimeException( 'Require at least the callback param' ); if ( !is_callable( $args[0] ) throw new InvalidArgumentException( 'Callback param is invalid' ); return call_user_func_array( array_shift( $args ), $args ); }