Оператор instanceof и наследяване в ООП в PHP

Нека разгледаме особеностите на наследяването при използване на оператора instanceof. Да предположим, че имаме родителски клас и детски клас:

index.php<?php
  // Родителски клас:
  class ParentClass
  {
    
  }
  
  // Детски клас:
  class ChildClass extends ParentClass
  {
    
  }
?>

Нека създадем обект от детския клас:

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

Сега нека проверим с помощта на instanceof, дали нашият обект принадлежи на класа ParentClass и на класа ChildClass:

index.php<?php
  var_dump($obj instanceof ChildClass);  // ще върне true
  var_dump($obj instanceof ParentClass); // също ще върне true
?>

Както виждате от примера - операторът instanceof не прави разлика при проверка между родителски и детски класове.

Не се обърквайте - ако обектът наистина е от родителския клас, тогава, разбира се, проверката за принадлежност към детския клас ще върне false:

php<?php
  $obj = new ParentClass; // обект от родителския клас
  
  var_dump($obj instanceof ParentClass); // ще върне true
  var_dump($obj instanceof ChildClass);  // ще върне false
?>
Задание 1

Създайте клас User с публични свойства name и surname.

Задание 2

Създайте клас Employee, който наследява от класа User и добавя свойство salary.

Задание 3

Създайте клас City с публични свойства name и population.

Задание 4

Създайте 3 обекта от клас User, 3 обекта от клас Employee, 3 обекта от клас City и ги запишете в произволен ред в масив $arr.

Задание 5

Обходете в цикъл масива $arr и изведете на екрана колона от свойствата name на тези обекти, които принадлежат на класа User или на наследник на този клас.

Задание 6

Обходете в цикъл масива $arr и изведете на екрана колона от свойствата name на тези обекти, които не принадлежат на класа User или на наследник на този клас.

Задание 7

Обходете в цикъл масива $arr и изведете на екрана колона от свойствата name на тези обекти, които принадлежат точно на класа User, тоест не на класа City и не на класа Employee.