2010-05-14 11 views
70

Ich war ziemlich aufgeregt zu lesen über anonymous functions in PHP, mit dem Sie eine Variable, die Funktion einfacher ist, als Sie mit create_function tun könnten. Jetzt frage ich mich, ob ich eine Funktion habe, die eine Variable übergibt, wie kann ich überprüfen, ob es eine Funktion ist? Es gibt keine is_function() Funktion noch nicht, und wenn ich eine var_dump einer Variablen tun, das ist eine Funktion ::php is_function() zu bestimmen, ob eine Variable eine Funktion ist

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

ich diese:

object(Closure)#8 (0) { } 

Irgendwelche Gedanken darüber, wie wenn dies überprüfen ist eine Funktion?

Antwort

109

Verwenden is_callable, um zu bestimmen, ob eine bestimmte Variable eine Funktion ist. Zum Beispiel:

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

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

is_callable() funktioniert gut, ob Sie eine anonyme Funktion, einen Funktionsnamen als String oder ein gültiges PHP-Callback-Array übergeben. Wenn Sie nur nach anonymen Funktionen suchen möchten, möchten Sie etwas, was Gumbo sagt: Stellen Sie sicher, dass der Parameter ein Objekt ist, und stellen Sie sicher, dass es sich um eine Instanz von Closure handelt. – Lane

+1

Was, wenn ich überprüfen möchte, ob es ein calllack oder eine Schnur ist und verschiedene Sachen für sie tut. Ich möchte nicht, dass ein Zeichenfolgenwert versehentlich als Rückruf verwendet wird. – Gherman

+2

@Deutsch Erst checken Sie erst wenn is_string ($ func) dann als zweites check mit is_callable ($ func) – Heroselohim

29

Sie können function_exists verwenden, um zu überprüfen, ob eine Funktion mit dem angegebenen Namen vorhanden ist. Und zu kombinieren, dass mit anonymen Funktionen, dies versuchen:

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

Danke dafür! Meine App ermöglicht es Benutzern, ihre eigene Hashfunktion anzugeben oder alternativ ein Argument für hash() anzugeben. Aber einige der gültigen Hash-Algorithmen sind auch PHP-Builtins und daher aufrufbar (zum Beispiel 'md5', 'sha1'). 'is_object()' und 'instanceof Closure' ist eine viel robustere Möglichkeit dies zu überprüfen! – njbair

+0

Entfernen Sie die Aufrufe is_string und function_exists. Dies ist die Funktion, die Sie zum Erkennen von Lambda-Funktionen verwenden möchten. Vielen Dank! – jack

17

Wenn Sie nur, ob eine Variable überprüfen wollen, ist eine anonyme Funktion, und nicht ein aufrufbare String oder Array, verwenden instanceof.

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

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

Anonyme Funktionen (von der Art, die in PHP 5.3 hinzugefügt wurde) sind immer Instanzen der Closure Klasse, und jede Instanz der Closure-Klasse ist eine anonyme Funktion.

Es gibt eine andere Art von Sache in PHP, die wohl als eine Funktion betrachtet werden könnte, und das sind Objekte, die die __invoke magische Methode implementieren. Wenn Sie diese einschließen möchten (ohne Strings und Arrays auszuschließen), verwenden Sie method_exists($func, '__invoke'). Dies schließt immer noch Schließungen ein, da Schließungen __invoke aus Gründen der Konsistenz implementieren.

+4

Dies ist besonders hilfreich, weil 'is_callable()' versuchen wird, eine Methode zu finden, die basierend auf einer übergebenen Zeichenfolge oder einem Array aufruft, die Klassen automatisch laden kann und möglicherweise nicht das von Ihnen erwartete Verhalten ist. – spikyjt

0
function is_function($f) { 
    return is_callable($f) && !is_string($f); 
} 
Verwandte Themen