is_aとis_subclass_ofの違い
クラス名の文字列を渡して使用しようとしたときに罠にはまったのでメモ。
- is_a
- is_subclass_of
はまったのは、v5.3.9から追加されたというallow_stringパラメータのデフォルト値に関連するものだが、他にも違いがあるようなので、2パターンほど試してみる。
試した環境は以下の通り。
各メソッドのマニュアルを読むと、以下のようになっている。
- is_a
- allow_stringのデフォルト値はFALSE、つまり検査対象に文字列を許さない
- is_subclass_of
- allow_stringのデフォルト値はTRUE、つまり検査対象に文字列を許す
つまり、CentOS 6(PHP 5.3.3)の環境下では上記の挙動しか選択できない。
テスト1:直系の子クラスを指定
コードは以下のようなもの。
<?php class A{} class B extends A{} $b = new B(); var_dump( is_a($b, "A") , is_subclass_of($b, "A") , is_a("B", "A") , is_subclass_of("B", "A") );
出力は以下。
bool(true) bool(true) bool(false) bool(true)
「is_a("B", "A")
」のパターンだけ、検証対象のクラス名を表す文字列を指定できないのでfalse
が返されている。
テスト2:親クラス自身を指定
コードは以下のようなもの。
<?php class A{} $a = new A(); var_dump( is_a($a, "A") , is_subclass_of($a, "A") , is_a("A", "A") , is_subclass_of("A", "A") );
出力は以下。
bool(true) bool(false) bool(false) bool(false)
「is_subclass_of($a, "A")
」で、確かに「サブクラス」ではないのでfalse
が返されている。
「is_a("A", "A")
」でfalse
が返されるのは、テスト1と同じ理由。