instanceof 用於判斷物件是否為特定類別的實例、子類別實例,或是否實作某介面。PHP 5 引入。
<?php
$manager = new Employee();
if ($manager instanceof Employee) {
echo "Yes";
}
?>
注意:類別名稱不加引號,加引號會導致語法錯誤。
$obj instanceof ClassNameinstanceof 父類別回傳 true$obj instanceof InterfaceName<?php
class Test {}
class TestChild extends Test {}
interface ExampleInterface { public function interfaceMethod(); }
class ExampleClass implements ExampleInterface {
public function interfaceMethod() { return 'Hello World!'; }
}
$a = new Test();
$m = new Test();
$d = new TestChild();
$ex = new ExampleClass();
// 基本判斷
var_dump($m instanceof Test); // true
var_dump($d instanceof Test); // true (子類別)
// switch 搭配
switch ($a instanceof Test) {
case true: echo 'YES'; break;
case false: echo 'No'; break;
}
// 介面判斷
if ($ex instanceof ExampleInterface) {
echo 'Yes, it is';
}
?>
關鍵差異:instanceof 包含自身類別,is_subclass_of() 僅檢查繼承關係(不含自身)。
<?php
class Foo { public $foobar = 'Foo'; }
class Bar extends Foo { public $foobar = 'Bar'; }
$a = new Foo();
$b = new Bar();
var_dump($a instanceof Foo); // true
var_dump($b instanceof Foo); // true
var_dump(is_subclass_of($a, 'Foo')); // false
var_dump(is_subclass_of($b, 'Foo')); // true
?>
同理,$a instanceof Bar 為 false,is_subclass_of($a, 'Bar') 也為 false。
搭配 switch 或 if-else 鏈,根據物件類型執行不同邏輯,常見於多型處理場景。