instanceof 用來判斷一個 PHP 變數是否屬於某一類 class 的實例:
Example #1 對類別使用 instanceof
<?php class MyClass { } class NotMyClass { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof NotMyClass); ?>
以上例程會輸出:
bool(true))也請問可用來決定一個變數是不是繼承自某一父類別的子類別的實例:
Example #2 對繼承類別使用 instanceof
<?php class ParentClass { } class MyClass extends ParentClass { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof ParentClass); ?>
bool(true)
檢查一個物件是否不是某個類別的實例,可以使用邏輯運算子 not。
Example #3 使用 instanceof 檢查物件不是某個類別的實例
Example #3 使用 instanceof 檢查物件不是某個類別的實例
<?php class MyClass { } $a = new MyClass; var_dump(!($a instanceof stdClass)); ?>
bool(true)
最後,instanceof也可用於確定一個變數是不是實現了某個介面的物件的實例:
Example #4 對介面使用 instanceof
<?php interface MyInterface { } class MyClass implements MyInterface { } $a = new MyClass; var_dump($a instanceof MyClass); var_dump($a instanceof MyInterface); ?>
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。不允許用來檢測常數。
Example #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 Fatal error: instast
bool(false) instanceof 的使用還有一些陷阱必須要了解。在 PHP 5.1.0 之前,如果要檢查的類別名稱不存在,instanceof 會呼叫 __autoload()。另外,如果該類別沒有被裝載則會產生一個致命錯誤。可以透過使用動態類別參考或用一個包含類別名稱的字串變數來避開這種問題:
Example #7 避免PHP 5.0 中instanceof 引起的類別名稱查找和致命錯誤問題
<?php $d = 'NotMyClass'; var_dump($a instanceof $d); // no fatal error here ?>