web-dev-qa-db-fra.com

php is_function () pour déterminer si une variable est une fonction

J'étais assez enthousiaste à l'idée de fonctions anonymes en php, qui vous permettent de déclarer une variable dont la fonction est plus simple qu'avec create_function . Maintenant, je me demande si une fonction est passée à une variable, comment puis-je la vérifier pour déterminer s'il s'agit d'une fonction? Il n'y a pas encore de fonction is_function (), et quand je fais un var_dump d'une variable qui est une fonction:

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

J'ai compris:

object(Closure)#8 (0) { } 

Des idées sur la façon de vérifier si cela est une fonction? 

77
Jage

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.
}
118
Jon Benedicto

Vous pouvez utiliser function_exists pour vérifier s’il existe une fonction portant le nom indiqué. Et pour 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));
}
30
Gumbo

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

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

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

Les fonctions anonymes (du type ajouté dans 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 sans doute être considérée comme une fonction, à savoir les 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 inclura toujours les fermetures, car les fermetures implémentent __invoke pour des raisons de cohérence.

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