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

Lesezeit: 4 Minuten

Ich war ziemlich aufgeregt darüber zu lesen Anonyme Funktionen in PHP, mit denen Sie eine Variable deklarieren können, deren Funktion einfacher ist, als Sie es tun könnten 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 bekomme das:

object(Closure)#8 (0) { } 

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

Benutzer-Avatar
Jon Benedikt

Verwenden is_callable um festzustellen, ob eine gegebene Variable eine Funktion ist. Zum Beispiel:

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

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

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

    – Fahrbahn

    3. November 2011 um 16:21 Uhr


  • Was ist, wenn ich überprüfen möchte, ob es sich um einen Callack oder eine Schnur handelt, und verschiedene Dinge für sie tun möchte? Ich möchte nicht, dass ein Zeichenfolgenwert versehentlich als Rückruf verwendet wird.

    – Deutsch

    19. August 2014 um 11:26 Uhr

  • @German Einfach zuerst prüfen ob is_string($func) dann als zweites mit is_callable($func) prüfen

    – Heroselohim

    8. Januar 2015 um 21:48 Uhr

  • 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 instanceof Closure) && is_callable($variable)) {…}

    – Basilikum Musa

    18. Dezember 2015 um 12:21 Uhr

  • Warum die Abschlussinstanz AND aufrufbar ist. Wann ist eine Schließung nicht kündbar? Wäre nicht überrascht, wenn es eine Zeit gäbe, aber ich bin neugierig, warum wir beide Prüfungen brauchen.

    – Joel M

    1. Januar 2020 um 1:46 Uhr

Sie können verwenden function_exists um zu überprüfen, ob es eine Funktion mit dem angegebenen Namen gibt. Und um das 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));
}

  • Danke dafür! Meine App ermöglicht es Benutzern, ihre eigene Hash-Funktion anzugeben oder alternativ ein Argument für hash() bereitzustellen. Aber einige der gültigen Hashing-Algorithmen sind auch PHP builtins und daher aufrufbar (z. B. ‘md5’, ‘sha1’). is_object() und instanceof Closure ist eine viel robustere Methode, um dies zu überprüfen!

    – njbair

    22. Dezember 2012 um 18:50 Uhr


  • Entfernen Sie die Aufrufe is_string und function_exists und dies ist die Funktion, die Sie verwenden möchten, um Lambda-Funktionen zu erkennen. Vielen Dank!

    – Wagenheber

    10. September 2013 um 13:22 Uhr

  • @njbair Ich bin mir sicher, dass Sie daran gedacht haben, aber was ist, wenn jemand etwas Bösartiges in seiner eigenen Hash-Funktion angibt?

    – Rätsel Plus

    11. März 2021 um 10:20 Uhr

  • @EnigmaPlus Ich habe ehrlich gesagt keine Ahnung, woran ich damals gearbeitet habe, aber ich nehme an, dass ich an einer Bibliothek gearbeitet habe, nicht an einer App, und dass die Hash-Funktion im Code angegeben werden würde, nicht über das Frontend durch ein End- Benutzer.

    – njbair

    12. März 2021 um 14:35 Uhr

Wenn Sie nur prüfen möchten, ob eine Variable eine anonyme Funktion und kein aufrufbarer String oder Array ist, verwenden Sie instanceof.

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

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

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

Es gibt eine andere Art von Dingen in PHP, die wohl als Funktion betrachtet werden könnten, und das sind Objekte, die die implementieren __invoke magische Methode. Wenn Sie diese einschließen möchten (während Sie immer noch Zeichenfolgen und Arrays ausschließen), verwenden Sie method_exists($func, '__invoke'). Dies wird immer noch Schließungen beinhalten, da Schließungen implementiert werden __invoke für Konsistenz.

  • Dies ist besonders hilfreich, weil is_callable() versucht, eine Methode zu finden, die auf der Grundlage einer übergebenen Zeichenfolge oder eines Arrays aufgerufen werden kann, was Klassen automatisch laden kann und möglicherweise nicht das Verhalten ist, das Sie erwarten/erfordern.

    – spitzjt

    16. Februar 2015 um 10:12 Uhr

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

Benutzer-Avatar
Andrej Izman

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

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

1354270cookie-checkphp is_function() um festzustellen, ob eine Variable eine Funktion ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy