instanceof 是 PHP 5 引入的類型運算子,用於檢查物件是否為特定類別的實例、子類別實例,或實作特定介面的實例。取代了舊版的 is_a() 函數,語法更直觀、效能更佳。
class User {}
$user = new User();
var_dump($user instanceof User); // true
interface Loggable {}
class BaseModel implements Loggable {}
class User extends BaseModel {}
$user = new User();
var_dump($user instanceof BaseModel); // true(父類別)
var_dump($user instanceof Loggable); // true(介面)
PHP 5.1.0 前,若檢查的類別不存在會觸發 __autoload() 甚至致命錯誤。解法:使用字串變數或動態類別引用。
$className = 'NotMyClass';
var_dump($user instanceof $className); // false,不會報錯
$str = 'hello';
var_dump($str instanceof User); // false,不會報錯
$obj = null;
var_dump($obj instanceof User); // false
namespace App\Models;
class User {}
$user = new User();
// 在同命名空間下
var_dump($user instanceof User); // true
var_dump($user instanceof \App\Models\User); // true
// 在其他命名空間需完整路徑
var_dump($user instanceof \User); // false(指向全域 \User)
| 特性 | instanceof | is_a() |
|---|---|---|
| 語法 | 運算子 | 函數 |
| 效能 | 較快(編譯期優化) | 較慢(函數呼叫開銷) |
| 自動載入觸發 | 否(PHP 5.1.0+) | 是(舊版行為) |
| 建議版本 | PHP 5.0+ | 已棄用(PHP 5.3.0+) |
function validateInput($input) {
if ($input instanceof \DateTime) {
return $input->format('Y-m-d');
}
if ($input instanceof \Traversable) {
return iterator_to_array($input);
}
return (string)$input;
}
if ($service instanceof \Psr\Container\ContainerInterface) {
return $service->get($id);
}
instanceof 是現代 PHP 型別檢查的標準工具is_a(),建議所有專案統一使用