PHP での型チェック方法まとめ

機会はそう多くはないのですが、 PHP で型チェックをしたくなるときがときどきあります。 このあたりに関して PHP はなんだかわかりづらいので、かんたんにまとめておきたいと思います。

  • gettype()
  • get_class()
  • instanceof
  • is_a()
  • method_exists()
  • property_exists()
  • ReflectionMethod

gettype()

gettype() はプリミティブ型・組み込み型のデータ型のチェックを行うために使用します。

gettype(3);
// => 'integer'
gettype('hello');    
// => 'string'

戻り値はあくまでも文字列です。

ちなみに、プリミティブ型・組み込み型に関しては、型チェック用の関数が数多く用意されています(ここにあげたもの以外にもあります):

  • is_scalar()
  • is_string()
  • is_numeric()
  • is_bool()
  • is_array()
  • is_null()

get_class()

get_class() はオブジェクトの型のチェックのために使用します。

$d = new DateTime();
get_class($d);
// => 'DateTime'

$zip = new ZipArchive();
get_class($zip);
// => 'ZipArchive'

こちらも戻り値は文字列です。

instanceof

instanceof は親クラスも含めて「クラス - インスタンス」の関係をチェックするために使用します。

class Dog {
}

$d = new Dog();
$d instanceof Dog;
$class_name = 'Dog';
$d instanceof $class_name;
# => true

instanceofインスタンス instanceof クラス という形で使用します。 instanceof の右に置くクラスはクラスそのものの名前でも、それを格納した文字列でも OK です。 戻り値は true / false です。

is_a()

is_a() は親クラスも含めて「クラス - インスタンス」の関係をチェックするために使用します。 機能が instanceof にとてもよく似ています。

class Dog {
}

$d = new Dog();
is_a($d, Dog);
// => true

class SpecialDog extends Dog {
}

$d = new SpecialDog();
is_a($d, Dog);
// => true

戻り値は true / false です。

歴史的には、 instanceof と機能が重複するということで PHP 5.0.0 でいったん deprecated の扱いになった後 PHP 5.3.0 で deprecated が解除されたそうです。 個人的には、 is_a() は使わず instanceof で統一しておけばよいのではないかと思います。

method_exists()

method_exists() はメソッドの存在チェックを行うために使用します。

class Dog {
  public function bow() {
  } 
  private function bowwow() {
  } 
}

$d = new Dog();
method_exists($d, 'bow');
// => true

method_exists($d, 'bowwow');
// => true

こちらも戻り値は true / false です。

property_exists()

property_exists()method_exists() と同様で、対象がメソッドかプロパティかという点のみ異なります。

ReflectionMethod

ReflectionMethod クラスはメソッドの可視性のタイプをチェックしたいときに使用します。

class Dog {
  private function bowwow() {
  } 
}

$check = new ReflectionMethod(Dog, 'bowwow');
$check->isPublic();    // => false
$check->isProtected(); // => true
$check->isPrivate();    // => false

以上です。

このあたりは名付けのルールに一貫したポリシーがあまりない感じでなかなか気持ち悪いですが・・・ PHP にはこういう機能もきちんと用意されているよ、という感じですね。

追記 2018/10/20: instanceof について追記しました。