|
PHP4からオブジェクト指向的な機能・動作が改善されていますが、オブジェクト指向言語であるJavaとどの程度挙動が異なるか、ちょっとずつまとめてみようかと思います。基本的には、PHPマニュアルに記載されていなくて、「どうなるの?」と思ったことを主にやっています。
今回は、「クラスの親子関係(instanceof編)」についてです。
Javaのinstanceofに相当する(正確ではないですが。。。)ものにis_subclass_of関数がありますが、is_subclass_of関数はあくまで「サブクラスかどうか」を返す関数なので、当該オブジェクト自身をis_subclass_ofすると「false」が返ります(Javaの場合はtrue)。
で、(ちょっと無理矢理ですが)基底クラスに以下のようなinstanceOfメソッドを追加して、Javaのinstanceofにしてみました。
●InstanceofTest.php
<?php
class ClassA
{
function ClassA()
{
echo "ClassA<br>";
}
function instanceOf($className)
{
return is_subclass_of($this, $className) || get_class($this) == strtolower($className);
}
}
class ClassB extends ClassA
{
function ClassB()
{
echo "ClassB<br>";
}
}
class ClassC extends ClassB
{
function ClassC()
{
echo "ClassC<br>";
}
}
class ClassD
{
function ClassD()
{
echo "ClassD<br>";
}
}
$YESNO = array("not", "");
$obj = new ClassC();
echo "ClassC is " . get_class($obj) . "<br>";
echo "super class of ClassC is " . get_parent_class($obj) . "<br>";
echo "ClassC is " . $YESNO[$obj->instanceOf("ClassA")] . "an instance of ClassA<br>";
echo "ClassC is " . $YESNO[$obj->instanceOf("ClassB")] . "an instance of ClassB<br>";
echo "ClassC is " . $YESNO[$obj->instanceOf("ClassC")] . "an instance of ClassC<br>";
echo "ClassC is " . $YESNO[$obj->instanceOf("ClassD")] . "an instance of ClassD<br>";
?>
●出力結果
ClassC
ClassC is classc
super class of ClassC is classb
ClassC is an instance of ClassA
ClassC is an instance of ClassB
ClassC is an instance of ClassC
ClassC is not an instance of ClassD
|