Opérateur instanceof et héritage en POO en PHP
Analysons les particularités de l'héritage lors de l'utilisation
de l'opérateur instanceof. Supposons que nous ayons une classe parent
et une classe enfant :
<?php
// Classe parent :
class ParentClass
{
}
// Classe enfant :
class ChildClass extends ParentClass
{
}
?>
Créons un objet de la classe enfant :
<?php
$obj = new ChildClass;
?>
Vérifions maintenant à l'aide de instanceof
si notre objet appartient à la classe ParentClass
et à la classe ChildClass :
<?php
var_dump($obj instanceof ChildClass); // affichera true
var_dump($obj instanceof ParentClass); // affichera également true
?>
Comme vous pouvez le voir dans l'exemple - l'opérateur instanceof
ne fait pas de distinction lors de la vérification entre les classes parentes
et les classes enfants.
Ne vous trompez pas - si l'objet est réellement
de la classe parent, alors, bien sûr, la vérification
d'appartenance à la classe enfant retournera
false :
<?php
$obj = new ParentClass; // objet de la classe parent
var_dump($obj instanceof ParentClass); // affichera true
var_dump($obj instanceof ChildClass); // affichera false
?>
Créez une classe User avec les propriétés publiques
name et surname.
Créez une classe Employee qui
héritera de la classe User et ajoutera
une propriété salary.
Créez une classe City avec les propriétés publiques
name et population.
Créez 3 objets de la classe User,
3 objets de la classe Employee,
3 objets de la classe City, et
dans un ordre arbitraire, enregistrez-les dans un tableau
$arr.
Parcourez en boucle le tableau $arr et affichez
à l'écran la colonne des propriétés name des
objets qui appartiennent à la classe User
ou à une classe descendante de celle-ci.
Parcourez en boucle le tableau $arr et affichez
à l'écran la colonne des propriétés name des
objets qui n'appartiennent pas à la classe User
ou à une classe descendante de celle-ci.
Parcourez en boucle le tableau $arr et affichez
à l'écran la colonne des propriétés name des
objets qui appartiennent précisément à la classe
User, c'est-à-dire ni à la classe City
ni à la classe Employee.