Mis à jour le lundi 8 janvier 2018
  • 30 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

L'opérateur instanceof

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Vous êtes-vous déjà demandé s'il était possible de savoir si un objet était une instance de telle classe ? Si vous vous êtes déjà posé cette question, vous n'avez normalement pas trouvé de réponse vraiment claire. Un moyen simple de vérifier une telle chose est d'utiliser l'opérateur instanceof. Ce sera un court chapitre car cette notion n'est pas bien difficile. Il faut juste posséder quelques pré-réquis.

En voici la liste :

  • Bien maîtriser les notions de classe, d'objet et d'instance .

  • Bien maîtriser le concept de l'héritage (si vous ne maîtrisez pas bien la résolution statique à la volée ce n'est pas bien important).

  • Savoir ce qu'est une interface et savoir s'en servir.

Présentation de l'opérateur

L'opérateur instanceof permet de vérifier si tel objet est une instance de telle classe. C'est un opérateur qui s'utilise dans une condition. Ainsi, on pourra créer des conditions comme « si $monObjetest une instance de MaClasse, alors... ».

Maintenant voyons comment construire notre condition. À gauche de notre opérateur,nous allons y placer notre objet. À droite de notre opérateur, nous allons placer, comme vous vous en doutez sûrement, le nom de la classe.

Exemple :

<?php
class A { }
class B { }

$monObjet = new A;

if ($monObjet instanceof A) // Si $monObjet est une instance de A.
{
  echo '$monObjet est une instance de A';
}
else
{
  echo '$monObjet n\'est pas une instance de A';
}

if ($monObjet instanceof B) // Si $monObjet est une instance de B.
{
  echo '$monObjet est une instance de B';
}
else
{
  echo '$monObjet n\'est pas une instance de B';
}

Bref, je pense que vous avez compris le principe. :)

Il y a cependant plusieurs façons de procéder et quelques astuces (c'est d'ailleurs pour toutes les présenter que j'ai créé ce chapitre).

Parmi ces méthodes, il y en a une qui consiste à placer le nom de la classe pour laquelle on veut vérifier que tel objet est une instance dans une variable sous forme de chaîne de caractères. Exemple :

<?php
class A { }
class B { }

$monObjet = new A;

$classeA = 'A';
$classeB = 'B';

if ($monObjet instanceof $classeA)
{
  echo '$monObjet est une instance de ', $classeA;
}
else
{
  echo '$monObjet n\'est pas une instance de ', $classeA;
}

if ($monObjet instanceof $classeB)
{
  echo '$monObjet est une instance de ', $classeB;
}
else
{
  echo '$monObjet n\'est pas une instance de ', $classeB;
}

Une autre façon d'utiliser cet opérateur est de spécifier un autre objet à la place du nom de la classe. La condition renverra true si les deux objets sont des instances de la même classe. Exemple :

<?php
class A { }
class B { }

$a = new A;
$b = new A;
$c = new B;

if ($a instanceof $b)
{
  echo '$a et $b sont des instances de la même classe';
}
else
{
  echo '$a et $b ne sont pas des instances de la même classe';
}

if ($a instanceof $c)
{
  echo '$a et $c sont des instances de la même classe';
}
else
{
  echo '$a et $c ne sont pas des instances de la même classe';
}

Et voilà. Vous connaissez les trois méthodes possibles pour utiliser cet opérateur. Pourtant, il existe encore quelques effets que peut produire instanceof. Poursuivons donc ce chapitre tranquillement.

instanceof et l'héritage

L'héritage est de retour ! En effet, instanceof a un comportement bien particulier avec les classes qui héritent entre elles. Voici ces effets.

Vous vous souvenez sans doute (enfin j'espère...) de la première façon d'utiliser l'opérateur. Voici une révélation : la condition renvoie true si la classe spécifiée est une classe parente de la classe instanciée par l'objet spécifié. Exemple :

<?php
class A { }
class B extends A { }
class C extends B { }

$b = new B;

if ($b instanceof A)
{
  echo '$b est une instance de A ou $b instancie une classe qui est une fille de A';
}
else
{
  echo '$b n\'est pas une instance de A et $b instancie une classe qui n\'est pas une fille de A';
}

if ($b instanceof C)
{
  echo '$b est une instance de C ou $b instancie une classe qui est une fille de C';
}
else
{
  echo '$b n\'est pas une instance de C et $b instancie une classe qui n\'est pas une fille de C';
}

Voilà, j'espère que vous avez compris le principe car celui-ci est le même avec les deuxième et troisième méthodes.

Nous allons donc maintenant terminer ce chapitre avec une dernière partie concernant les réactions de l'opérateur avec les interfaces. Ce sera un mélange des deux premières parties, donc si vous êtes perdus, relisez bien tout (eh oui, j'espère que vous n'avez pas oublié l'héritage entre interfaces :-° ).

instanceof et les interfaces

Voyons maintenant les effets produits par l'opérateur avec les interfaces.

Hein ? Comment ça ? Je comprends pas... Comment peut-on vérifier qu'un objet soit une instance d'une interface sachant que c'est impossible ? o_O

Comme vous le dites si bien, il est impossible de créer une instance d'une interface (au même titre que de créer une instance d'une classe abstraite, ce qu'est à peu près une interface). L'opérateur va donc renvoyer true si tel objet instancie une classe implémentant telle interface.

Voici un exemple :

<?php
interface iA { }
class A implements iA { }
class B { }

$a = new A;
$b = new B;

if ($a instanceof iA)
{
  echo 'Si iA est une classe, alors $a est une instance de iA ou $a instancie une classe qui est une fille de iA. Sinon, $a instancie une classe qui implémente iA.';
}
else
{
  echo 'Si iA est une classe, alors $a n\'est pas une instance de iA et $a n\'instancie aucune classe qui est une fille de iA. Sinon, $a instancie une classe qui n\'implémente pas iA.';
}

if ($b instanceof iA)
{
  echo 'Si iA est une classe, alors $b est une instance de iA ou $b instancie une classe qui est une fille de iA. Sinon, $b instancie une classe qui implémente iA.';
}
else
{
  echo 'Si iA est une classe, alors $b n\'est pas une instance de iA et $b n\'instancie aucune classe qui est une fille de iA. Sinon, $b instancie une classe qui n\'implémente pas iA.';
}

Ce code se passe de commentaires, les valeurs affichées détaillant assez bien je pense.

Après avoir vu l'utilisation de l'opérateur avec les interfaces, nous allons voir comment il réagit lorsqu'on lui passe en paramètre une interface qui est héritée par une autre interface qui est implémentée par une classe qui est instanciée. Vous voyez à peu près à quoi je fais sréférence ? Je vais procéder en PHP au cas où vous n'ayez pas tout suivi.

<?php
interface iParent { }
interface iFille extends iParent { }
class A implements iFille { }

$a = new A;

if ($a instanceof iParent)
{
  echo 'Si iParent est une classe, alors $a est une instance de iParent ou $a instancie une classe qui est une fille de iParent. Sinon, $a instancie une classe qui implémente iParent ou une fille de iParent.';
}
else
{
  echo 'Si iParent est une classe, alors $a n\'est pas une instance de iParent et $a n\'instancie aucune classe qui est une fille de iParent. Sinon, $a instancie une classe qui n\'implémente ni iParent, ni une de ses filles.';
}

Vous savez maintenant tous les comportements que peut adopter cet opérateur et tous les effets qu'il peut produire (tout est écrit dans le précédent code).

En résumé

  • L'opérateur instanceof permet de vérifier la nature de la classe dont l'objet testé est une instance.

  • Cet opérateur permet de vérifier qu'un certain objet est bien une instance d'une classe fille de telle classe.

  • Cet opérateur permet de vérifier qu'un certain objet est une instance d'une classe implémentant telle interface, ou que l'une de ses classes mère l'implémente.

Pour aller plus loin

Dès à présent, vous êtes prêts à être lâchés dans la nature. Cependant, il est possible d'aller encore plus loin dans le monde de l'orienté objet. En effet, la meilleure technique pour progresser est de pratiquer afin d'être le plus à l'aise possible avec ce paradigme. Cette pratique s'acquiert en utilisant des frameworks orientés objets. Il en existe un bon nombre, dont voici les principaux.

  • Symfony. Framework assez complet et puissant, il est beaucoup utilisé dans le monde professionnel (le Site du Zéro l'utilise par exemple). Si ce framework vous intéresse, je vous conseille de lire le tutoriel sur Symfony disponible sur ce site. Si vous avez lu et compris la partie « Réalisation d'un site web », l'apprentissage des bases de ce framework sera quasi instantanée (cette partie du tutoriel s'inspire beaucoup de Symfony).

  • Zend Framework. Framework encore plus complet, souvent comparé à une usine à gaz. Certains diront que c'est une qualité (car le framework est par conséquent très souple et s'adapte à votre façon de coder), d'autres un défaut. Ce framework est aussi très utilisé dans le milieu professionnel.

  • CodeIgniter. Framework bien plus léger mais moins complet. C'est à vous de compléter sa bibliothèque, soit en téléchargeant des scripts que la communauté a développés, soit en les créant vous-mêmes. Lire le tutoriel sur CodeIgniter disponible sur ce site.

  • CakePHP. Ce framework a cherché du même côté que Symfony pour trouver son inspiration. Par conséquent, là aussi, l'apprentissage des bases de ce framework sera très rapide. Si vous voulez vous pencher sur CakePHP, je vous conseille le CakePHP Cookbook.

Exemple de certificat de réussite
Exemple de certificat de réussite