2012-08-01 28 views
5

La funzione che sto chiamando con call_user_func deve restituire FALSE. Quindi, come posso rilevare gli errori se il callable non è valido?Cosa succede se call_user_func deve restituire false?

(Nota a margine: perché non hanno generato un'eccezione piuttosto che restituire un codice di errore? O c'è un modo per "catturare" gli errori? Ho un errore di gestione. ?)

+0

Inoltre, giuro ho provato a cercare questo e proprio non riuscivo a trovare le parole magiche per arrivare là. Guidarmi ad una domanda appropriata sarebbe fantastico se lo sapessi. –

+4

Puoi testare prima con ['is_callable'] (http://www.php.net/manual/en/function.is-callable.php). – bfavaretto

+0

Che cosa significa "non valido"? –

risposta

10

Se si desidera verificare se esiste effettivamente la funzione o il metodo da chiamare, è possibile utilizzare is_callable prima di chiamare call_user_func. Si può avvolgere il tutto in una funzione per un facile riutilizzo:

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

hai chiesto in un commento sul perché PHP genera errori invece di utilizzare le eccezioni. Penso che sia perché le eccezioni sono state introdotte solo in PHP5, quindi la maggior parte delle funzioni PHP si basa sulla segnalazione degli errori. Sembra che ci sia un modo per aggirare che, come indica the manual:

funzioni PHP interno principalmente usano Error reporting, solo i moderni Object oriented estensioni utilizzare le eccezioni. Tuttavia, gli errori possono essere semplicemente tradotti in eccezioni con ErrorException.

+0

A mio parere, a volte la compatibilità all'indietro deve solo andare. Tuttavia, sto scavando così tanto negli affari di 'ErrorException'. Grazie! –

1

Non hanno generato Eccezione perché è necessario mantenere questa funzione compatibile all'indietro. Non era presente alcuna eccezione nelle versioni precedenti di PHP, PHP < 5.

Il tipo di ritorno booleano era "riservato" per il rapporto di errore della funzione. Quello che devi fare è scoprire perché la funzione fallirebbe. Immagino che l'unica ragione per cui fallirebbe è per argomenti non validi.

Forse wraping in una chiamata sicura sarebbe fare quello che vuoi:

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); 
} 
Problemi correlati