2010-05-14 9 views
70

Ero piuttosto entusiasta di leggere su anonymous functions in php, che consente di dichiarare una variabile che è la funzione più facile di quanto si possa fare con create_function. Ora mi chiedo se ho una funzione che passa una variabile, come posso controllarla per determinare se si tratta di una funzione? Non v'è alcuna funzione is_function() ancora, e quando faccio una var_dump di una variabile che è una funzione ::php is_function() per determinare se una variabile è una funzione

$func = function(){ 
    echo 'asdf'; 
}; 
var_dump($func); 

ottengo questo:

object(Closure)#8 (0) { } 

Ogni pensiero su come controllare se questo è una funzione?

risposta

109

Usa is_callable per determinare se una data variabile è una funzione. Per esempio:

$func = function() 
{ 
    echo 'asdf'; 
}; 

if(is_callable($func)) 
{ 
    // Will be true. 
} 
+7

is_callable() funzionerà benissimo se si passa a una funzione anonima, un nome di funzione come stringa o un array di callback PHP valido. Se si desidera controllare in modo specifico solo le funzioni anonime, si consiglia qualcosa di simile a quello che ha detto Gumbo: assicurarsi che il parametro sia un oggetto e assicurarsi che si tratti di un'istanza di chiusura. – Lane

+1

Cosa succede se voglio verificare se è un callack o una stringa e fare cose diverse per loro. Non voglio che un valore stringa venga preso per errore come callback. – Gherman

+2

@German Basta controllare prima se is_string ($ func) poi come secondo controllo con is_callable ($ func) – Heroselohim

29

È possibile utilizzare function_exists per verificare che esista una funzione con il nome specificato. E per che si combinano con funzioni anonime, provate questo:

function is_function($f) { 
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure)); 
} 
+0

Grazie per questo! La mia app consente agli utenti di specificare la propria funzione di hashing o fornire alternativamente un argomento per hash(). Ma alcuni degli algoritmi di hashing validi sono anche compilati in PHP, e quindi richiamabili ('md5', 'sha1' per esempio). 'is_object()' e 'instanceof Closure' sono un modo molto più robusto per verificarlo! – njbair

+0

Rimuovere le chiamate is_string e function_exists e questa è la funzione che si desidera utilizzare per rilevare le funzioni lambda. Grazie! – jack

17

Se si vuole solo controllare se una variabile è una funzione anonima, e non una stringa callable o un array, utilizzare instanceof.

$func = function() 
{ 
    echo 'asdf'; 
}; 

if($func instanceof Closure) 
{ 
    // Will be true. 
} 

funzioni anonime (del tipo che sono stati aggiunti in PHP 5.3) sono sempre istanze della classe Closure, e ogni istanza della classe Closure è una funzione anonima.

C'è un altro tipo di cosa in PHP che potrebbe essere considerato una funzione, e questo è gli oggetti che implementano il metodo magico __invoke. Se si desidera includerli (escludendo ancora le stringhe e gli array), utilizzare method_exists($func, '__invoke'). Ciò includerà ancora le chiusure, poiché le chiusure implementano __invoke per coerenza.

+4

Ciò è particolarmente utile, perché 'is_callable()' proverà a trovare un metodo per chiamare in base a una stringa o array passato, il che può caricare automaticamente le classi e potrebbe non essere il comportamento che ci si aspetta/richieda. – spikyjt

0
function is_function($f) { 
    return is_callable($f) && !is_string($f); 
} 
Problemi correlati