48 votes

Quelle est la différence exacte entre is_callable et function_exists en PHP ?

Je travaille sur un projet, dans lequel j'utilise une fonction dépréciée de l'ancienne version. Mais je ne veux pas que mon script s'arrête s'il est utilisé dans l'ancienne version.

Je vérifie donc si la fonction existe et si non, je la crée.

Quelle est la différence entre function_exists y is_callable en PHP et laquelle est la meilleure à utiliser ?

if (!is_callable('xyz')) {
    function xyz() {
       // code goes here
    }
}

OU

if(!function_exists('xyz')) {
    function xyz() {
      // code goes here
    }
}

61voto

Artefacto Points 50896

La fonction is_callable accepte non seulement les noms de fonctions, mais aussi d'autres types d'informations. rappels :

  • Foo::method
  • array("Foo", "method")
  • array($obj, "method")
  • Fermetures et autres objets invocables (PHP 5.3)

Alors is_callable accepte tout ce que vous pourriez passer call_user_func et la famille, tandis que function_exists indique seulement si une certaine fonction existe (pas les méthodes, voir method_exists pour cela, ni les fermetures).

En d'autres termes, is_callable est une enveloppe pour zend_is_callable qui gère les variables à l'aide du pseudo-type callback. function_exists ne fait qu'un consultation d'une table de hachage dans le tableau des fonctions.

0 votes

Dans une affaire qui method est une méthode publique de Foo et "Foo" n'est pas initialisé, is_callable('Foo', 'method') a retourné false tandis que method_exists('Foo', 'method') a retourné true . Ps. J'ai testé ceci dans un foreach (get_declared_classes() as $class) boucle.

12voto

codaddict Points 154968

Lorsqu'il est utilisé avec une fonction (et non une méthode de classe), il n'y a pas de différence sauf que function_exists est légèrement plus rapide.

Mais lorsqu'il est utilisé pour vérifier l'existence de méthodes dans une classe, vous ne peut pas utiliser function_exists . Vous devrez utiliser is_callable o method_exists .

9voto

Yomi ojo Points 11

Lorsqu'il est utilisé dans un contexte de classe, is_callable retourne vrai pour les méthodes de la classe qui sont accessibles ie méthodes publiques mais method_exists renvoie la réponse vraie pour toutes les méthodes - public, protected et private. function_exists fait la même chose que method_exists en dehors des contextes de classe.

3voto

Loki Astari Points 116129

Si une fonction Plop existe alors function_exists("Plop") retournera vrai.

Voir function_exists

Si une variable est appelable, alors is_callable($var) retournera vrai.
Maintenant, cela pourrait signifier que $var est un nom de fonction.
Mais il peut aussi s'agir d'une combinaison de noms d'objets et de méthodes.

Voir is_callable

2voto

Lionel Chan Points 3238

Un autre différent :

Si vous avez une classe qui utilise __call méthode magique El is_callable($object, $method) retournera toujours vrai pour n'importe quoi car __call accepte en fait tous les noms de méthodes. Et comme vous le savez peut-être déjà, method_exists retournera false pour cela si la méthode n'est pas définie dans la classe.

Ceci est particulièrement gênant si vous utilisez CakePHP Model comme ils ont mis en œuvre __call méthode magique pour fournir des requêtes magiques, mais pas cool si vous voulez que la méthode soit absolument définie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X