関数の概要
PHPの is_a 関数は、あるオブジェクトが指定したクラスのインスタンスかどうかを確認するための関数です。オブジェクトが指定したクラス自身、もしくはそのクラスを継承した子クラスのインスタンスであれば true を返します。クラスの種類を判別したいときに非常に便利な関数です。
パラメータの説明
object:チェックしたいオブジェクトを指定します。class_name:調べたいクラス名を文字列で指定します。クラス名は名前空間を含む完全修飾名でも可。allow_string(省略可能):デフォルトはfalse。trueにすると、オブジェクトの代わりにクラス名の文字列を渡しても判定できますが、通常はオブジェクトを渡します。
戻り値
対象のオブジェクトが指定クラスのインスタンスもしくはサブクラスのインスタンスの場合は true を返します。それ以外の場合は false を返します。
使用例
基本的な使い方
<?php
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Dog')); // bool(true)
var_dump(is_a($dog, 'Animal')); // bool(true)
var_dump(is_a($dog, 'Cat')); // bool(false)
?>
この例では、$dog は Dog クラスのインスタンスなので、'Dog' と 'Animal'(親クラス)に対して true を返します。'Cat' には属さないので false です。
文字列でクラス名を渡す例(allow_string を true に設定)
<?php
class Vehicle {}
class Car extends Vehicle {}
var_dump(is_a('Car', 'Vehicle', true)); // bool(true)
var_dump(is_a('Vehicle', 'Car', true)); // bool(false)
?>
このように第3引数に true を渡すと、オブジェクトではなくクラス名の文字列を判定に使用できます。継承関係に基づいて判定されます。
インターフェースの判定にも利用可能
<?php
interface LoggerInterface {}
class FileLogger implements LoggerInterface {}
$logger = new FileLogger();
var_dump(is_a($logger, 'LoggerInterface')); // bool(true)
?>
is_a はクラスだけでなく、インターフェースの実装確認にも使えます。この例では $logger は LoggerInterface を実装しているため true となります。
関連する関数
instanceof演算子 – オブジェクトがクラスかどうかの判定に使うより一般的な方法get_class()– オブジェクトのクラス名を取得するis_subclass_of()– オブジェクトやクラスが指定クラスのサブクラスかを判定する
まとめ
is_a 関数は、PHPでオブジェクトが指定したクラスやインターフェースに属しているかを簡単に調べることができる便利な関数です。継承関係やインターフェース実装も判定可能なので、状況に応じて使い分けることで安全な型チェックが行えます。特に動的に渡されるオブジェクトの種類を確認したい場合に役立つため、実務でもよく利用されます。
