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

PHP

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 について追記しました。

参考


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら