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)
bool(false)
instanceof 也可用來確定一個變數是不是繼承自某一父類的子類的執行個體:
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)
bool(true)
檢查一個對象是否不是某個類的執行個體,可以使用邏輯運算子 not。
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)
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: instanceof expects an object instance, constant given
然而 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?>
以上常式會輸出:
bool(false)
instanceof 運算子是 PHP 5 引進的。在此之前用 is_a(),但是後來 is_a() 被廢棄而用 instanceof 替代了。注意自 PHP 5.3.0 起,又恢複使用 is_a() 了。