HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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と同じ理由。