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(),传入类名数组
函数灵活、简洁,便于维护和扩展
通过封装这样的函数,代码更加优雅且易于理解,是开发中常用的实用技巧。