PHP is_subclass_of函数的一个BUG和解决方法
is_subclass_of的作用:
boolis_subclass_of(objectobject,stringclass_name)
如果对象object所属类是类class_name的子类,则返回TRUE,否则返回FALSE。
注:自PHP5.0.3起也可以用一个字符串来指定object参数(类名)。
使用例子:
#判断$className是否是$type的子类 is_subclass_of($className,$type);
php5.3.7版本前针对interface会有一个bug
bug:https://bugs.php.net/bug.php?id=53727
interfaceMyInterface{}
classParentClassimplementsMyInterface{}
classChildClassextendsParentClass{}
#true
is_subclass_of('ChildClass','MyInterface');
#false
is_subclass_of('ParentClass','MyInterface');
解决办法:
functionisSubclassOf($className,$type){
//如果$className所属类是$type的子类,则返回TRUE
if(is_subclass_of($className,$type)){
returntrue;
}
//如果php版本>=5.3.7不存在interfacebug所以$className不是$type的子类
if(version_compare(PHP_VERSION,'5.3.7','>=')){
returnfalse;
}
//如果$type不是接口也不会有bug所以$className不是$type的子类
if(!interface_exists($type)){
returnfalse;
}
// 创建一个反射对象
$r=newReflectionClass($className);
// 通过反射对象判断该类是否属于$type接口
return$r->implementsInterface($type);
}