php is_function () um festzustellen, ob eine Variable eine Funktion ist

88

Ich war ziemlich aufgeregt, über anonyme Funktionen in PHP zu lesen , mit denen Sie eine Variable deklarieren können, deren Funktion einfacher ist als mit create_function . Jetzt frage ich mich, ob ich eine Funktion habe, der eine Variable übergeben wird. Wie kann ich sie überprüfen, um festzustellen, ob es sich um eine Funktion handelt? Es gibt noch keine is_function () -Funktion, und wenn ich einen var_dump einer Variablen mache, die eine Funktion ist ::

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

Ich verstehe das:

object(Closure)#8 (0) { } 

Irgendwelche Gedanken darüber, wie man prüft, ob dies eine Funktion ist?

Jage
quelle

Antworten:

138

Verwenden Sie is_callablediese Option , um zu bestimmen, ob eine bestimmte Variable eine Funktion ist. Beispielsweise:

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

if( is_callable( $func ) )
{
    // Will be true.
}
Jon Benedicto
quelle
10
is_callable () funktioniert hervorragend, unabhängig davon, ob Sie eine anonyme Funktion, einen Funktionsnamen als Zeichenfolge oder ein gültiges PHP-Callback-Array übergeben. Wenn Sie speziell nur nach anonymen Funktionen suchen möchten, möchten Sie etwa das, was Gumbo gesagt hat: Stellen Sie sicher, dass der Parameter ein Objekt und eine Instanz von Closure ist.
Lane
2
Was ist, wenn ich überprüfen möchte, ob es sich um einen Rückruf oder eine Zeichenfolge handelt, und verschiedene Dinge für sie tun möchte? Ich möchte nicht, dass ein Zeichenfolgenwert versehentlich als Rückruf verwendet wird.
Gherman
2
@ Deutsch Überprüfen Sie zuerst, ob is_string ($ func), dann als zweite Prüfung mit is_callable ($ func)
Heroselohim
4
Das obige Code-Snippet hat mich in Schwierigkeiten gebracht. Ich beabsichtigte eine Zeichenfolge mit der Bezeichnung "Datum", die dann als Abschluss behandelt und ausgeführt wurde. Der richtige Weg ist if (($ variable Instanz von Closure) && is_callable ($ variable)) {...}
Basil Musa
1
Warum Instanz der Schließung AND aufrufbar ist. Wann ist eine Schließung nicht kündbar? Wäre nicht überrascht, wenn es eine Zeit gäbe, aber ich bin gespannt, warum wir beide Schecks brauchen.
Joel M
34

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

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}
Gumbo
quelle
Danke dafür! In meiner App können Benutzer ihre eigene Hashing-Funktion angeben oder alternativ ein Argument für hash () angeben. Einige der gültigen Hashing-Algorithmen sind jedoch auch in PHP integriert und daher aufrufbar (z. B. 'md5', 'sha1'). is_object()und instanceof Closureist eine viel robustere Möglichkeit, dies zu überprüfen!
NJBair
Entfernen Sie die Aufrufe is_string und function_exists. Mit dieser Funktion möchten Sie Lambda-Funktionen erkennen. Danke dir!
Jack
28

Wenn Sie nur überprüfen möchten, ob eine Variable eine anonyme Funktion und keine aufrufbare Zeichenfolge oder ein aufrufbares Array ist, verwenden Sie instanceof.

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

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

Anonyme Funktionen (wie sie in PHP 5.3 hinzugefügt wurden) sind immer Instanzen der ClosureKlasse, und jede Instanz der ClosureKlasse ist eine anonyme Funktion.

Es gibt eine andere Art von Dingen in PHP, die wohl als Funktion angesehen werden könnten, und das sind Objekte, die die __invokemagische Methode implementieren . Wenn Sie diese einschließen möchten (ohne Zeichenfolgen und Arrays auszuschließen), verwenden Sie method_exists($func, '__invoke'). Dies schließt weiterhin Schließungen ein, da Schließungen aus Gründen der __invokeKonsistenz implementiert werden .

Brilliand
quelle
8
Dies ist besonders hilfreich, da is_callable()versucht wird, eine Methode zum Aufrufen zu finden, die auf einer übergebenen Zeichenfolge oder einem übergebenen Array basiert. Diese können Klassen automatisch laden und entsprechen möglicherweise nicht dem Verhalten, das Sie erwarten / benötigen.
Spikyjt
2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}
Artemiy StagnantIce Alexeew
quelle
In Zukunft könnte PHP gettype () von Object in Callable ändern, wie dies bereits in anderen Sprachen der Fall ist. Diese Antwort ist wahrscheinlich der beste Weg. Dies kann jedoch wie folgt optimiert werden: return! Is_string ($ f) &&! Is_array ($ f) && is_callable ($ f).
Alexandre T.
0

In PHP können gültige Callables Funktionen, Name von Funktionen (Strings) und Arrays der Formulare sein ['className', 'staticMethod']oder [$object, 'method'], um nur Funktionen zu erkennen, müssen Strings und Arrays ausgeschlossen werden:

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
Andrey Izman
quelle