PHPにおけるinstanceof演算子とOOにおける継承
instanceof演算子を使用する際の継承の特徴を詳しく見ていきましょう。 親クラスと子クラスがあるとします:
<?php
// 親クラス:
class ParentClass
{
}
// 子クラス:
class ChildClass extends ParentClass
{
}
?>
子クラスのオブジェクトを作成します:
<?php
$obj = new ChildClass;
?>
次に、instanceofを使用して、
このオブジェクトがParentClassクラスと
ChildClassクラスに属しているかどうかを確認しましょう:
<?php
var_dump($obj instanceof ChildClass); // trueを出力
var_dump($obj instanceof ParentClass); // これもtrueを出力
?>
この例からわかるように、instanceof演算子は、
親クラスと子クラスを区別せずにチェックを行います。
混乱しないでください - もしオブジェクトが実際に
親クラスのものであれば、当然ながら子クラスへの
所属チェックはfalseを返します:
<?php
$obj = new ParentClass; // 親クラスのオブジェクト
var_dump($obj instanceof ParentClass); // trueを出力
var_dump($obj instanceof ChildClass); // falseを出力
?>
パブリックプロパティnameとsurnameを持つ
Userクラスを作成してください。
Userクラスを継承し、プロパティsalaryを追加する
Employeeクラスを作成してください。
パブリックプロパティnameとpopulationを持つ
Cityクラスを作成してください。
Userクラスのオブジェクトを3個、
Employeeクラスのオブジェクトを3個、
Cityクラスのオブジェクトを3個作成し、
任意の順序で配列$arrに格納してください。
配列$arrをループで処理し、Userクラス
またはその子孫クラスに属するオブジェクトの
nameプロパティを画面に縦に出力してください。
配列$arrをループで処理し、Userクラス
またはその子孫クラスに*属さない*オブジェクトの
nameプロパティを画面に縦に出力してください。
配列$arrをループで処理し、*厳密に*Userクラス
に属する(つまりCityクラスでもEmployeeクラスでもない)
オブジェクトのnameプロパティを画面に縦に出力してください。