PHP is_subclass_of函数的一个BUG和解决方法


Posted in PHP onJune 01, 2014

is_subclass_of的作用:

bool is_subclass_of ( object object, string class_name )

如果对象 object 所属类是类 class_name 的子类,则返回 TRUE,否则返回 FALSE。
注: 自 PHP 5.0.3 起也可以用一个字符串来指定 object 参数(类名)。

使用例子:

#判断$className是否是$type的子类
is_subclass_of($className,$type);

php5.3.7版本前针对interface会有一个bug

bug:https://bugs.php.net/bug.php?id=53727

interface MyInterface {}
class ParentClass implements MyInterface { }
class ChildClass extends ParentClass { }# true
is_subclass_of('ChildClass', 'MyInterface');
# false
is_subclass_of('ParentClass', 'MyInterface');

解决办法:

function isSubclassOf($className, $type){
    // 如果 $className 所属类是 $type 的子类,则返回 TRUE   
    if (is_subclass_of($className, $type)) {
        return true;
    }    // 如果php版本>=5.3.7 不存在interface bug 所以 $className 不是 $type 的子类
    if (version_compare(PHP_VERSION, '5.3.7', '>=')) {
        return false;
    }
    // 如果$type不是接口 也不会有bug 所以 $className 不是 $type 的子类
    if (!interface_exists($type)) {
        return false;
    }
    //  创建一个反射对象
    $r = new ReflectionClass($className); 
    //  通过反射对象判断该类是否属于$type接口
    return $r->implementsInterface($type);
}
PHP 相关文章推荐
PHP开发入门教程之面向对象
Dec 05 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
php生成静态页面的简单示例
Apr 17 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
浅谈php和.net的区别
Sep 28 PHP
PHP 正则表达式小结
Feb 12 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
php抓取网站图片并保存的实现方法
Oct 29 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
Nov 27 PHP
ThinkPHP发送邮件示例代码
Oct 08 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
Dec 02 PHP
PHP中数组的分组排序实例
Jun 01 #PHP
php_screw安装使用教程(另一个PHP代码加密实现)
May 29 #PHP
PHP Curl出现403错误的解决办法
May 29 #PHP
PHP的foreach中使用引用时需要注意的一个问题和解决方法
May 29 #PHP
神盾加密解密教程(一)PHP变量可用字符
May 28 #PHP
CI框架开发新浪微博登录接口源码完整版
May 28 #PHP
PHP+javascript制作带提示的验证码源码分享
May 28 #PHP
You might like
第六章 php目录与文件操作
2011/12/30 PHP
php 邮件发送问题解决
2014/03/22 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
2016/06/24 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
nodejs中函数的调用实例详解
2018/10/31 NodeJs
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
python的tkinter布局之简单的聊天窗口实现方法
2014/09/03 Python
Python fileinput模块使用实例
2015/05/28 Python
总结python实现父类调用两种方法的不同
2017/01/15 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
Python实现一个简单的验证码程序
2017/11/03 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
pip命令无法使用的解决方法
2018/06/12 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
python 字符串追加实例
2019/07/20 Python
python配置文件写入过程详解
2019/10/19 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
"序列点" 是什么
2016/07/29 面试题
食品安全承诺书
2014/05/22 职场文书
学生意外伤害赔偿协议书
2014/09/17 职场文书
初中重阳节活动总结
2015/05/05 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python