PHP fournit depuis la version 4 des fonctions pour vérifier l’existence de fonctions et de méthodes de classes. Voici un petit topo sur ces différents outils et leurs astuces.
Considérons une classe Page avec une méthode Publish, et une fonction nouvelle Page comme suit :
class Page { function publish() { echo "Page publiée !"; } } function nouvellePage() { $p2 = new Page(); } $p = new Page();
is_callable permet de tester l’existence à la fois de fonctions et de méthodes. Pour cela, le premier paramètre accepte une chaîne de caractères, ou un tableau à deux entrées contenant :
- l’instance de l’objet ou le nom de classe,
- une chaine contenant le nom de méthode à tester
$b = is_callable(array('Page', 'publish')); // Renvoie TRUE $b = is_callable(array($p, 'publish')); // Renvoie TRUE
Astuce rencontrée dans les commentaires PHP et dans mon code perso quand vous testez l’existence d’une méthode de classe : ne pas oublier l’array, car l’appel suivant à is_callable est valide, renvoie FALSE mais ne déclenche pas de warning :
$b = is_callable($p, 'publish'); // Renvoie FALSE
Pour tester l’existence d’une fonction, utilisez comme suit :
$b = is_callable('nouvellePage'); // Renvoie TRUE
Dernière considération à prendre en compte : is_callable renvoie TRUE sur des fonctions PHP supposées désactivées dans php.ini. A vous de faire le bout de code pour le gérer (voir commentaires PHP de la fonction !).
Cependant, il est généralement considéré que deux autres fonctions plus spécialisées sont des alternatives beaucoup plus rapides d’environ 50% : function_exists et method_exists.
$b = method_exists($p, 'publish'); // Renvoie TRUE $b = method_exists('Page', 'publish'); // Renvoie FALSE $b = function_exists('nouvellePage')); // Renvoie TRUE $b = function_exists('funcImaginaire')); // Renvoie FALSE
Comme affiché ci-dessus, une petite différence entre is_callable et method_exists concerne les méthodes d’une classe et les méthodes d’un objet instancié : method_exists ne marche qu’avec les objets instanciés.
En revanche, dans les deux cas, un fonctionnement curieux - considéré comme un bug par la communauté - affiche les méthodes privées et protégées en PHP 5. Assurez-vous d’utiliser method_exists conjointement avec get_class_methods pour recouper l’information avec la “vraie” liste des méthodes publiques de l’objet.
janvier 16th, 2008 at 7:44
Par curiosité, j’aurai aimé savoir dans quel contexte vous utilisez ces fonctions?
Pour ma part, il m’est arrivé d’utiliser la fonction “class_exists()” (très rarement), mais je ne suis jamais descendu jusqu’à l’existence d’une méthode.
Sinon, félicitations pour votre site : clair, agréable et intelligent.
janvier 16th, 2008 at 9:33
Tout d’abord, merci pour votre remarque
J’ai utilisé ces fameuses fonctions dans le contexte d’un site avec un système de modération des données, et utilisant un ORM (la classe Page représente la table `page` dans MySQL)
Il s’agissait lors de la publication d’une donnée de pouvoir effectuer si besoin des traitements spécifiques en ajoutant une méthode Publish() facultative à l’objet. Le système de publication teste donc si l’objet contient cette méthode et l’appelle.
janvier 17th, 2008 at 7:43
Ok, ça reste donc très spécifique mais ça peut avoir un intérêt à un moment donné pour une gestion dynamique des traitements. Comme d’habitude, le tout est de savoir que les fonctions existent, pour au moins avoir l’idée de les employer le jour où l’on sera confronté à une problématique similaire…