PHPの型演算子

伊谢尔伦
伊谢尔伦オリジナル
2016-11-24 13:24:301466ブラウズ

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 = &#39;MyClass&#39;;
    $d = &#39;NotMyClass&#39;;
    var_dump($a instanceof $b); // $b is an object of class MyClass
    var_dump($a instanceof $c); // $c is a string &#39;MyClass&#39;
    var_dump($a instanceof $d); // $d is a string &#39;NotMyClass&#39;
?>

上記のルーチンは次のように出力します:

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 = &#39;NotMyClass&#39;;
    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() の使用が復活していることに注意してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。