PHPにおけるinstanceof演算子とOOにおける継承

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

パブリックプロパティnameとsurnameを持つ Userクラスを作成してください。

Задание 2

Userクラスを継承し、プロパティsalaryを追加する Employeeクラスを作成してください。

Задание 3

パブリックプロパティnameとpopulationを持つ Cityクラスを作成してください。

Задание 4

Userクラスのオブジェクトを3個、 Employeeクラスのオブジェクトを3個、 Cityクラスのオブジェクトを3個作成し、 任意の順序で配列$arrに格納してください。

Задание 5

配列$arrをループで処理し、Userクラス またはその子孫クラスに属するオブジェクトの nameプロパティを画面に縦に出力してください。

Задание 6

配列$arrをループで処理し、Userクラス またはその子孫クラスに*属さない*オブジェクトの nameプロパティを画面に縦に出力してください。

Задание 7

配列$arrをループで処理し、*厳密に*Userクラス に属する(つまりCityクラスでもEmployeeクラスでもない) オブジェクトのnameプロパティを画面に縦に出力してください。