2010-05-14 9 views
70

J'ai été très excité de lire à propos de anonymous functions en PHP, ce qui vous permet de déclarer une variable qui est fonction plus facile que vous pourriez faire avec create_function. Maintenant je me demande si j'ai une fonction qui est passée une variable, comment puis-je la vérifier pour déterminer si c'est une fonction? Il n'y a pas de fonction is_function() encore, et quand je fais un var_dump d'une variable qui est fonction ::php is_function() pour déterminer si une variable est une fonction

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

Je reçois ceci:

object(Closure)#8 (0) { } 

Toute réflexion sur la façon de vérifier si cette est une fonction?

Répondre

109

Utilisez is_callable pour déterminer si une variable donnée est une fonction. Par exemple:

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

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

is_callable() fonctionnera très bien si vous transmettez une fonction anonyme, un nom de fonction sous forme de chaîne ou un tableau de callback PHP valide. Si vous voulez spécifiquement vérifier uniquement les fonctions anonymes, alors vous voudriez quelque chose comme ce que Gumbo a dit: assurez-vous que le paramètre est un objet, et assurez-vous qu'il s'agit d'une instance de fermeture. – Lane

+1

Que faire si je veux vérifier si c'est un callack ou une chaîne et faire des choses différentes pour eux. Je ne veux pas qu'une valeur de chaîne soit accidentellement prise comme rappel. – Gherman

+2

@German Vérifiez d'abord si is_string ($ func) puis comme deuxième vérification avec is_callable ($ func) – Heroselohim

29

Vous pouvez utiliser function_exists pour vérifier s'il existe une fonction avec le nom donné. Et de combiner cela avec des fonctions anonymes, essayez ceci:

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

Remerciements pour cet article! Mon application permet aux utilisateurs de spécifier leur propre fonction de hachage, ou de fournir alternativement un argument pour hash(). Mais certains des algorithmes de hachage valides sont aussi des builtins PHP, et donc appelables ('md5', 'sha1' par exemple). 'is_object()' et 'instanceof Closure' est un moyen beaucoup plus robuste de vérifier cela! – njbair

+0

Supprimez les appels is_string et function_exists et c'est la fonction que vous souhaitez utiliser pour détecter les fonctions lambda. Je vous remercie! – jack

17

Si vous voulez seulement vérifier si une variable est une fonction anonyme, et non une chaîne appelable ou tableau, utilisez instanceof.

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

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

Les fonctions anonymes (du genre qui ont été ajoutés en PHP 5.3) sont toujours des instances de la classe Closure, et chaque instance de la classe Closure est une fonction anonyme.

Il existe un autre type de chose dans PHP qui pourrait être considéré comme une fonction, et ce sont des objets qui implémentent la méthode magique __invoke. Si vous souhaitez les inclure (tout en excluant les chaînes et les tableaux), utilisez method_exists($func, '__invoke'). Cela inclut toujours les fermetures, car les fermetures implémentent __invoke pour la cohérence.

+4

Ceci est particulièrement utile, car 'is_callable()' essaiera de trouver une méthode à appeler en fonction d'une chaîne ou d'un tableau passé, ce qui peut entraîner le chargement automatique des classes et peut ne pas être le comportement attendu. – spikyjt

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