216 votes

Quelle est la différence entre is_a et instanceof?

Je sais que instanceof est un opérateur et que is_a est une méthode.

La méthode est-elle plus lente en performance? Que préféreriez-vous utiliser?

219voto

ircmaxell Points 74865

En fait, is_a est une fonction, alors qu' instanceof est une structure du langage. is_a sera sensiblement plus lent (car il dispose de tous les frais généraux de l'exécution d'un appel de fonction), mais le temps d'exécution global est minime.

Il n'est plus obsolète depuis la version 5.3, donc il n'y a pas de soucis.

Il y a une différence, cependant. is_a étant une fonction prend un objet en tant que paramètre 1, et une chaîne de caractères (une variable, une constante ou littéral) comme paramètre 2. Donc:

is_a($object, $string); // <- Only way to call it

instanceof prend un objet en tant que paramètre 1, et vous pouvez prendre un nom de classe (variable), instance de l'objet (variable), ou de l'identificateur de classe (classe nom écrit sans les guillemets) comme paramètre 2.

$object instanceof $string;      // <- string class name
$object instanceof $otherObject; // <- object instance
$object instanceof ClassName;    // <- identifier for the class

51voto

Voici les résultats de performance de is_a () et instanceof :

 Test name       Repeats         Result          Performance     
instanceof      10000           0.028343 sec    +0.00%
is_a()          10000           0.043927 sec    -54.98%
 

La source de test est ici .

10voto

Lotus Notes Points 3287

instanceof peut être utilisé avec d'autres instances de l'objet, le nom de la classe ou une interface. Je ne pense pas qu' is_a() fonctionne avec les interfaces (seulement une chaîne de caractères représentant le nom d'une classe), mais corrigez-moi si ce n'. (Mise à jour: Voir https://gist.github.com/1455148)

Exemple de php.net:

interface MyInterface
{
}

class MyClass implements MyInterface
{
}

$a = new MyClass;
$b = new MyClass;
$c = 'MyClass';
$d = 'NotMyClass';

var_dump($a instanceof $b); // $b is an object of class MyClass
var_dump($a instanceof $c); // $c is a string 'MyClass'
var_dump($a instanceof $d); // $d is a string 'NotMyClass'

sorties:

bool(true)
bool(true)
bool(false)

6voto

Mike Branski Points 507

En ce qui concerne ChrisF réponse, is_a() n'est plus obsolète depuis PHP 5.3.0. Je trouve qu'il est toujours plus sûr de passer par la source officielle pour ce genre de choses.

En ce qui concerne votre question, Daniel, je ne peux pas dire sur les différences de rendement, mais une partie de celui-ci va en venir à la lisibilité et à laquelle vous trouvez plus facile de travailler avec.

Aussi, il y a une discussion à propos de la confusion autour de la négation de l' instanceof vérifier vs is_a(). Par exemple, pour instanceof vous ne:

<?php if( !($a instanceof A) ) { //... } ?>

vs suivantes pour is_a():

<?php if( !is_a($a, 'A' ) { //... } ?>

ou

<?php if( is_a($a, 'A') === FALSE) { //... } ?>

Edit Ressemble ChrisF supprimé de sa réponse, mais la première partie de ma réponse est toujours debout.

1voto

Nathan Loding Points 1576

Je ne peux pas parler pour les performances -- je n'ai pas mesuré encore rien-mais en fonction de ce que vous essayez, il existe des limitations de instanceof. Découvrez ma question, récemment, à ce sujet:

http://stackoverflow.com/questions/3002594/php-instanceof-failing-with-class-constant

J'ai fini par utiliser is_a à la place. J'aime la structure de l' instanceof mieux (je pense qu'il lit plus agréable) et continuera à l'utiliser où je peux.

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