instanceof は、PHP 変数が特定のクラスのインスタンスに属しているかどうかを判断するために使用されます:
例 #1 クラスでのinstanceof
<?php class MyClass { } class NotMyClass { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof NotMyClass); ?>
の使用 上記のルーチンは出力します:
bool(true)
bool(false)
instanceof 変数が特定の親クラスから継承されたサブクラスのインスタンスであるかどうかを判断するためにも使用できます:
例 #2 継承されたクラスでinstanceof
<?php class ParentClass { } class MyClass extends ParentClass { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof ParentClass); ?>
を使用します。 上記のルーチンは出力します:
bool(true)
bool(true)
オブジェクトがクラスのインスタンスでないかどうかを確認するには、論理演算子 not を使用できます。
例 #3 オブジェクトが特定のクラスのインスタンスではないことを確認するには、instanceof を使用します
<?php class MyClass { } $a = new MyClass; var_dump(!($a instanceof stdClass)); ?>
上記のルーチンは次のように出力します:
bool(true)
最後に、instanceof を使用して、変数が特定のクラスのインスタンスではないかどうかを判断することもできます。特定のインターフェイスを実装するオブジェクト 例:
例 #4 インターフェイスでのinstanceof
<?php interface MyInterface { } class MyClass implements MyInterface { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof MyInterface); ?>
の使用 上記のルーチンは出力:
bool(true)
bool(true)
ただし、instanceofは通常、クラスで直接使用されます。文字列変数:
<?php interface MyInterface { } class MyClass implements MyInterface { } $a = new MyClass; $b = new MyClass; $c = 'MyClass'; $d = 'NotMyClass'; var_dump($a instanceof $b); // $b is an object of class MyClass var_dump($a instanceof $c); // $c is a string 'MyClass' var_dump($a instanceof $d); // $d is a string 'NotMyClass' ?>
上記のルーチンは次のように出力します:
bool(true)
bool(true)
bool(false)
検出された変数がオブジェクトではない場合、instanceofエラー メッセージは発行されませんが、FALSE が返されます。定数の検出は許可されていません。
例 #6 他の変数を検出するには、instanceof を使用します
<?php $a = 1; $b = NULL; $c = imagecreate(5, 5); var_dump($a instanceof stdClass); // $a is an integer var_dump($b instanceof stdClass); // $b is NULL var_dump($c instanceof stdClass); // $c is a resource var_dump(FALSE instanceof stdClass); ?>
上記のルーチンは次の出力を行います:
bool(false)
bool(false)
bool(false)
PHP 致命的なエラー:instanceof はオブジェクト インスタンス、指定された定数を期待しています
ただし、instanceof を使用する場合には、注意しなければならない落とし穴がいくつかあります。 PHP 5.1.0 より前では、チェック対象のクラス名が存在しない場合、instanceof は __autoload() を呼び出していました。さらに、クラスがロードされていない場合は、致命的なエラーが生成されます。この問題は、動的クラス参照またはクラス名を含む文字列変数を使用することで回避できます:
例 #7 PHP 5.0 の instanceof によって引き起こされるクラス名の検索と致命的なエラーの問題を回避します
<?php $d = 'NotMyClass'; var_dump($a instanceof $d); // no fatal error here ?>
上記のルーチンは次を出力します:
bool(false)
instanceof 演算子は PHP 5 で導入されました。これ以前は is_a() が使用されていましたが、後に is_a() は放棄され、instanceof に置き換えられました。 PHP 5.3.0 では、is_a() の使用が復活していることに注意してください。