is_a(object $object, string $class_name, bool $allow_string = false): bool
$object要檢測的對象
$class_name類名字符串
返回true如果對象屬於該類或其子類,反之返回false
示例:
class Animal {}
class Dog extends Animal {}
$dog = new Dog();
var_dump(is_a($dog, 'Dog')); // true
var_dump(is_a($dog, 'Animal')); // true,因為 Dog 繼承 Animal
var_dump(is_a($dog, 'Cat')); // false
假設我們想判斷一個對像是否屬於類Dog 、 Cat或Bird中的任意一個,最常見的做法是:
if (is_a($obj, 'Dog') || is_a($obj, 'Cat') || is_a($obj, 'Bird')) {
// 對象屬於這三個類中的一個
}
如果判斷的類很多,這樣寫就不方便,也不利於維護。
我們可以封裝一個函數,傳入對象和類名數組,函數返回對像是否屬於這些類中的任意一個。
function is_a_any($object, array $classNames): bool {
foreach ($classNames as $className) {
if (is_a($object, $className)) {
return true;
}
}
return false;
}
使用示例:
$classes = ['Dog', 'Cat', 'Bird'];
if (is_a_any($obj, $classes)) {
echo "對象屬於其中一個類";
} else {
echo "對像不屬於這些類";
}
PHP 的類名是大小寫不敏感的,但為了嚴謹,我們可以在判斷時統一大小寫:
function is_a_any($object, array $classNames): bool {
foreach ($classNames as $className) {
if (is_a($object, $className)) {
return true;
}
}
return false;
}
實際上, is_a()本身已經對大小寫不敏感,所以不必額外處理。
如果還想判斷對像是否實現了某個接口,也適用is_a() 。
<?php
class Dog {}
class Cat {}
class Bird {}
class Bulldog extends Dog {}
function is_a_any($object, array $classNames): bool {
foreach ($classNames as $className) {
if (is_a($object, $className)) {
return true;
}
}
return false;
}
$bulldog = new Bulldog();
$checkClasses = ['Cat', 'Bird', 'Dog'];
if (is_a_any($bulldog, $checkClasses)) {
echo "對象屬於指定的類之一";
} else {
echo "對像不屬於這些類";
}
運行結果:
對象屬於指定的類之一
因為Bulldog是Dog的子類。
is_a()用於檢測對像是否屬於某類或其子類
多類判斷時,使用循環封裝函數is_a_any() ,傳入類名數組
函數靈活、簡潔,便於維護和擴展
通過封裝這樣的函數,代碼更加優雅且易於理解,是開發中常用的實用技巧。