概要
instanceof
:値のクラスをチェックis_a()
:値のクラスをチェックis_subclass_of()
:値の親クラスをチェックclass_uses()
:トレイトを使っているかどうかチェック
instanceof/is_a()
instanceof
インスタンス instanceof クラス等名
instanceof
は、第1オペランドが第2オペランドのクラスに合致しているかどうかをチェックする演算子。第2オペランドにはクラス名などをそのまま記述する。is_a()
関数と同じ機能。
以下の例の様に、instanceof
は、
- そのインスタンスのクラス、継承した親クラス、インプリメントしたインターフェイスに対して真となる
- トレイトについては
use
していても真とはならない
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
trait MyTrait { public function traitMethod() {} } interface MyInterface {} class MyParent { public function parentMethod() {} } class MyChild extends MyParent implements MyInterface { use MyTrait; public function childMethod() {} } class GrandChild extends MyChild {} $child = new MyChild(); $child = new MyChild(); echo $child instanceof MyChild ? "true\n" : "false\n"; echo $child instanceof MyParent ? "true\n" : "false\n"; echo $child instanceof MyInterface ? "true\n" : "false\n"; echo $child instanceof MyTrait ? "true\n" : "false\n"; // true // true // true // false |
is_a()
is_a(インスタンス, 'クラス等名');
is_a()
は第1引数のインスタンスが第2引数のクラスに合致しているかどうかチェックする。第2引数のクラス名は文字列として与える。
以下の例のように、親クラス、インターフェイス、トレイトに対する判定はinstanceof
と同じ。
1 2 3 4 5 6 7 8 9 |
echo is_a($child, 'MyChild') ? "true\n" : "false\n"; echo is_a($child, 'MyParent') ? "true\n" : "false\n"; echo is_a($child, 'MyInterface') ? "true\n" : "false\n"; echo is_a($child, 'MyTrait') ? "true\n" : "false\n"; // true // true // true // false |
is_subclass_of()
is_subclass_of(インスタンス, 'クラス等名');
is_subclass_of()は、第1引数のインスタンスのクラスが第2引数のクラスを継承しているかどうかをチェックする。引数の渡し方はis_a()
と同じ。
以下の例のように、
- 引数のインスタンスのクラスそのものは偽
- 継承した親クラスとインターフェースに対しては真
- トレイトは偽
1 2 3 4 5 6 7 8 9 |
echo is_subclass_of($child, 'MyChild') ? "true\n" : "false\n"; echo is_subclass_of($child, 'MyParent') ? "true\n" : "false\n"; echo is_subclass_of($child, 'MyInterface') ? "true\n" : "false\n"; echo is_subclass_of($child, 'MyTrait') ? "true\n" : "false\n"; // false // true // true // false |
class_uses()
class_uses(インスタンス);
class_uses()
は、引数インスタンスのクラスがuse
しているトレイト連想配列として返す。連想配列のキー・値とも、トレイト名の文字列。
1 2 3 4 5 6 |
var_dump(class_uses($child)); // array(1) { // ["MyTrait"]=> // string(7) "MyTrait" // } |
トレイトをuse
しているかどうかをチェックするには、class_uses()
の結果の連想配列に対して、in_array()
かarray_key_exists()
でトレイト名が含まれるかどうかをチェック。
1 2 3 |
echo in_array('MyTrait', class_uses($child)) ? "true\n" : "false\n"; // true |
親クラスでトレイトをuse
していても、子クラスのclass_uses()
では捕捉されない。
1 2 3 4 5 |
$grandchild = new GrandChild(); var_dump(class_uses($grandchild)); // array(0) { // } |
method_exists()/property_exists()
method_exists(インスタンス, ’クラス等名’)
property_exists(インスタンス, ’クラス等名’)
method_exists()
は、第1引数で指定したインスタンスのクラスに第2引数で指定したメソッドが定義されているかどうかをチェックする。同様に、property_exists()
はプロパティーが定義されているかどうかをチェックする。
以下の例で、method_exists()
について確認する。
- 指定したメソッドが定義されていれば
true
、定義されていなければfalse
- 親クラスのメソッドでも存在する(
true
)と判定(public
~private
に関わらない) - トレイトのメソッドも存在すると判定
- 親クラスで
use
されたトレイトのメソッドは、子クラスでも存在すると判定
1 2 3 4 5 6 7 8 9 10 |
echo method_exists($child, 'childMethod') ? "true\n" : "false\n"; echo method_exists($child, 'anotherMethod') ? "true\n" : "false\n"; echo method_exists($child, 'parentMethod') ? "true\n" : "false\n"; echo method_exists($child, 'traitMethod') ? "true\n" : "false\n"; echo method_exists($grandchild, 'traitMethod') ? "true\n" : "false\n"; // true // false // true // true |