PHP : instanceof ou is_a ?
Par Méthylbro le mercredi 9 septembre 2009, 08:00 - Développement - Lien permanent
Avant, en PHP4 il fallait utiliser la petite fonction is_a() pour savoir si un objet était bien d'un type x ou y. L'arrivée de PHP5 permis l'apparition d'un opérateur spécifique pour faire cela : instanceof.
A l'arrivée de ce nouvel opérateur, l'utilisation de la fonction PHP is_a() fut considérée comme obsolète. Mais, fait relativement intéressant is_a fit à nouveau son apparition dans PHP5.3 comme une fonction à part entière et cette fois-ci ; plus du tout estimée comme désuète.
Cependant dans cet imbroglio, comment savoir quelle méthode utiliser ? Comment expliquer la disparition puis la réapparition de la fonction is_a() ?
Jusqu'à présent j'utilisais sans réfléchir l'opérateur instanceof. Car tous les petits tests de consommation que j'ai pu faire entre ces deux méthodes ont toujours démontré une légère antécédence de l'opérateur sur la fonction.
Si l'on réalise par exemple l'expérience suivante, on obtient un résultat moyen de 0,00113301 microsecondes d'écart entre les deux méthodes :
class stdObject {}
$Object = new stdObject();
$it = 10000;
$comp = 'stdObject';
$microtime = microtime();
for ($i=0;$i<=$it; ++$i) if ($Object instanceof $comp) continue;
echo 'instanceof : '.microtime()-$microtime."\n";
$microtime = microtime();
for ($i=0;$i<=$it; ++$i) if (is_a($Object, $comp)) continue;
echo 'is_a : '.microtime()-$microtime;

(Graphique réalisé à partir de la moyenne de 1 500 fois l'expérience)
En conclusion donc, lors d'une utilisation simple, l'opérateur instanceof s'avère apparemment plus rapide à l'exécution. Je soumets néanmoins ces tests a caution car je n'ai jamais su réaliser des tests de performance réellement satisfaisants.
Avant PHP5.1 il aurait été compréhensible de voir encore cohabiter les deux méthodes car de ce temps, instanceof faisait appel à __autoload() dans le cas ou la classe de comparaison n'existais pas. Or ce n'est plus le cas depuis.
Pourquoi ce retour de la fonction is_a() dans PHP5.3 ? Cela reste tout de même un peut mystérieux pour le moment.
Et vous, vous utilisez quoi ? instanceof ou is_a ?
Commentaires