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?
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?
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
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 .
instanceof
peut être utilisé avec d'autres instances de l'objet, le nom de la classe ou une interface. Je ne pense pas qu' (Mise à jour: Voir https://gist.github.com/1455148)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'.
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)
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.
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 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.