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