PHP如何忽略继承关系精确判断对象是否为指定类而非父/子类
PHP 严格匹配对象所属类(忽略继承关系)实现方法
instanceof 运算符默认会沿类的继承链向上匹配,只要对象是目标类本身、目标类的子类实例,都会返回true,无法满足「仅当对象是目标类直接实例时返回true」的严格校验需求,可通过以下两种方案实现严格校验:
方案1:使用get_class()函数比对类名
get_class(对象实例)会返回该实例实际所属类的完整名称,不会考虑继承关系,直接将返回值和目标类名做全等(===)判断即可,兼容所有主流PHP版本:
class ExampleClass {} class ExampleClassExtension extends ExampleClass {} $a = new ExampleClass(); $b = new ExampleClassExtension(); // 严格校验逻辑 var_dump(get_class($a) === ExampleClass::class); // bool(true) var_dump(get_class($b) === ExampleClass::class); // bool(false) 符合预期 var_dump(get_class($b) === ExampleClassExtension::class); // bool(true)
方案2:直接读取实例的类名静态属性(PHP 8.0+ 支持)
PHP 8.0及以上版本支持直接通过实例访问::class常量,拿到的是实例实际所属类的完整名称,比对逻辑和get_class()完全一致,写法更简洁:
var_dump($a::class === ExampleClass::class); // bool(true) var_dump($b::class === ExampleClass::class); // bool(false)
注意事项
- 禁止使用
is_a()函数做这类严格校验,is_a()的匹配逻辑和instanceof一致,会自动识别继承关系,子类实例匹配父类时仍会返回true - 如果类定义在命名空间下,不要手写字符串类名做比对,优先使用
目标类::class常量获取带完整命名空间的类名,避免命名空间匹配错误 - 上述两种校验逻辑下,只要实例不是目标类本身的直接实例,无论是父类实例、子类实例、其他无关类实例,都会返回
false,完全匹配严格校验需求。
内容的提问来源于stack exchange,提问作者SamuraiMelon
相关产品推荐
相关产品推荐

