PHP instanceof (type opérateur)


Exemple

Pour vérifier si un objet est d'une certaine classe, l'opérateur (binaire) instanceof peut être utilisé depuis la version 5 de PHP.

Le premier paramètre (à gauche) est l'objet à tester. Si cette variable n'est pas un objet, instanceof renvoie toujours false . Si une expression constante est utilisée, une erreur est générée.

Le second paramètre (à droite) est la classe à comparer. La classe peut être fournie comme nom de classe lui-même, une variable de chaîne contenant le nom de la classe (pas une constante de chaîne!) Ou un objet de cette classe.

class MyClass {
}

$o1 = new MyClass();
$o2 = new MyClass();
$name = 'MyClass';

// in the cases below, $a gets boolean value true
$a = $o1 instanceof MyClass;
$a = $o1 instanceof $name;
$a = $o1 instanceof $o2;

// counter examples:
$b = 'b';
$a = $o1 instanceof 'MyClass'; // parse error: constant not allowed
$a = false instanceof MyClass; // fatal error: constant not allowed
$a = $b instanceof MyClass;    // false ($b is not an object)

instanceof peut également être utilisé pour vérifier si un objet appartient à une classe qui étend une autre classe ou implémente une interface:

interface MyInterface {
}

class MySuperClass implements MyInterface {
}

class MySubClass extends MySuperClass {
}

$o = new MySubClass();

// in the cases below, $a gets boolean value true    
$a = $o instanceof MySubClass;
$a = $o instanceof MySuperClass;
$a = $o instanceof MyInterface;

Pour vérifier si un objet n'est pas d'une classe, l'opérateur not ( ! ) Peut être utilisé:

class MyClass {
}

class OtherClass {
}

$o = new MyClass();
$a = !$o instanceof OtherClass; // true

Notez que les parenthèses autour de $o instanceof MyClass ne sont pas nécessaires car instanceof a une priorité plus élevée que ! , bien que cela puisse rendre le code plus lisible avec des parenthèses.

Mises en garde

Si une classe n'existe pas, les fonctions de chargement automatique enregistrées sont appelées pour tenter de définir la classe (il s'agit d'un sujet ne relevant pas de cette partie de la documentation!). Dans les versions de PHP antérieures à 5.1.0, l’opérateur instanceof déclencherait également ces appels, définissant ainsi la classe (et si la classe ne pouvait pas être définie, une erreur fatale se produirait). Pour éviter cela, utilisez une chaîne:

// only PHP versions before 5.1.0!
class MyClass {
}

$o = new MyClass();
$a = $o instanceof OtherClass; // OtherClass is not defined!
// if OtherClass can be defined in a registered autoloader, it is actually
// loaded and $a gets boolean value false ($o is not a OtherClass)
// if OtherClass can not be defined in a registered autoloader, a fatal
// error occurs.

$name = 'YetAnotherClass';
$a = $o instanceof $name; // YetAnotherClass is not defined!
// $a simply gets boolean value false, YetAnotherClass remains undefined.

Depuis PHP version 5.1.0, les autochargeurs enregistrés ne sont plus appelés dans ces situations.

Anciennes versions de PHP (avant 5.0)

Dans les anciennes versions de PHP (avant 5.0), la fonction is_a peut être utilisée pour déterminer si un objet appartient à une classe. Cette fonction est obsolète dans la version 5 de PHP et non précisée dans la version 5.3.0 de PHP.