Operatore instanceof ed ereditarietà in OOP in PHP

Analizziamo le caratteristiche dell'ereditarietà quando si utilizza l'operatore instanceof. Supponiamo di avere una classe genitore e una classe figlia:

index.php<?php
  // Classe genitore:
  class ParentClass
  {
    
  }
  
  // Classe figlia:
  class ChildClass extends ParentClass
  {
    
  }
?>

Creiamo un oggetto della classe figlia:

index.php<?php
  $obj = new ChildClass;
?>

Controlliamo ora con instanceof se il nostro oggetto appartiene alla classe ParentClass e alla classe ChildClass:

index.php<?php
  var_dump($obj instanceof ChildClass);  // restituirà true
  var_dump($obj instanceof ParentClass); // restituirà anche true
?>

Come puoi vedere dall'esempio - l'operatore instanceof non distingue tra classi genitore e classi figlie durante il controllo.

Non confonderti - se l'oggetto è effettivamente della classe genitore, allora ovviamente il controllo dell'appartenenza alla classe figlia restituirà false:

php<?php
  $obj = new ParentClass; // oggetto della classe genitore
  
  var_dump($obj instanceof ParentClass); // restituirà true
  var_dump($obj instanceof ChildClass);  // restituirà false
?>
Задание 1

Crea una classe User con le proprietà pubbliche name e surname.

Задание 2

Crea una classe Employee che erediti dalla classe User e aggiunga la proprietà salary.

Задание 3

Crea una classe City con le proprietà pubbliche name e population.

Задание 4

Crea 3 oggetti della classe User, 3 oggetti della classe Employee, 3 oggetti della classe City e, in ordine casuale, inseriscili nell'array $arr.

Задание 5

Scorri l'array $arr con un ciclo e visualizza a schermo la colonna delle proprietà name degli oggetti che appartengono alla classe User o a una classe discendente di questa.

Задание 6

Scorri l'array $arr con un ciclo e visualizza a schermo la colonna delle proprietà name degli oggetti che *non* appartengono alla classe User o a una classe discendente di questa.

Задание 7

Scorri l'array $arr con un ciclo e visualizza a schermo la colonna delle proprietà name degli oggetti che appartengono *esattamente* alla classe User, cioè non alla classe City e non alla classe Employee.