2012-08-01 14 views
5

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?¿Qué ocurre si call_user_func se supone que devuelve false?

(Nota al pie: ¿Por qué no tienen esto arrojar una excepción en lugar de devolver un código de error? ¿Hay alguna forma de "atrapar" errores? Tengo un error de manejo. ¿Debo hacer que arroje excepciones para mí? ?)

+0

Además, juro que traté de buscar esto y simplemente no podía encontrar las palabras mágicas para conseguirme allí. Dirigirme a una pregunta adecuada sería genial si lo sabes. –

+4

Primero puede hacer una prueba con ['is_callable'] (http://www.php.net/manual/en/function.is-callable.php). – bfavaretto

+0

¿Qué significa "no válido"? –

Respuesta

10

Si desea comprobar si realmente existe la función o el método para llamar, puede usar is_callable antes de llamar al call_user_func. Usted puede envolver todo el asunto en una función para facilitar la reutilización:

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

Usted preguntó en un comentario acerca de por qué PHP plantea errores en lugar de utilizar 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 evitar que, como indica the manual:

funciones PHP interna utilizan, sobre todo Error reporting, sólo Object oriented modernos utilizan extensiones excepciones. Sin embargo, los errores se pueden traducir simplemente a excepciones con ErrorException.

+0

En mi opinión, a veces la compatibilidad con versiones anteriores solo tiene que ir. Sin embargo, estoy tan cavando ese negocio 'ErrorException'. ¡Gracias! –

1

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

El tipo de retorno booleano estaba "reservado" para el informe de error de función. Lo que necesita 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 wraping en una llamada segura haría lo que quiere:

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); 
} 
Cuestiones relacionadas