从PHP的源码中深入了解stdClass类


Posted in PHP onApril 18, 2014

在百度百科中,对于stdClass的定义如下:

stdClass在PHP5才开始被流行。而stdClass也是zend的一个保留类。stdClass是PHP的一个基类,
所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。同时,
这个基类又有一个特殊的地方,就是没有方法。凡是用new stdClass()的变量,
都不可能会出现$a->test()这种方式的使用。PHP5的对象的独特性,对象在任何地方被调用,
都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。

以上的定义大多数都是正确的,但是一个致命性的诊断错误: stdClass是PHP的一个基类,所有的类几乎都继承这个类。 看一个简单的例子:

class EmptyClass {
}
$object = new EmptyClass();
if ($object instanceof stdClass) {
    echo 'yes';
}else{
    echo 'no';
}

执行代码,输出”no”,这个例子充分说明了stdClass类并不是所有类的基类。它仅仅是PHP的一个保留类,或者说一个类似于strlen函数这样的一个角色。 我们从源码的维度看看stdClass类的实现,它注册的位置在 Zend/zend_buildin_functions.c文件中。如下:

ZEND_MINIT_FUNCTION(core) { /* {{{ */
    zend_class_entry class_entry;
    /* 注册stdClass 类 */
    INIT_CLASS_ENTRY(class_entry, "stdClass", NULL);
    zend_standard_class_def = zend_register_internal_class(&class_entry TSRMLS_CC);
    /* 注册默认类,接口,如Exception类,SPL中的一些类等 */
    zend_register_default_classes(TSRMLS_C);    
    return SUCCESS;
}
/* }}} */

这是zend_builtin_module的模块初始化函数,在PHP内核进行模块初始化操作时会自动加载这个函数, 这样,stdClass类的注册操作也就会被执行了。从这段代码可以看出,stdClass类是一个没有成员变量也没有成员方法的类。 它的所有的魔术方法,父类、接口等在初始化时都被设置成NULL。由于在PHP中对于一个类我们无法动态的添加方法, 所以这个类只能用来处理动态属性,这也是我们一种常见的用法。

总结一下:

stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法。stdClass类可以被继承,只是这样做没有什么意义。

PHP 相关文章推荐
中国站长站 For Dede4.0 采集规则
May 27 PHP
phpMyAdmin链接MySql错误 个人解决方案
Dec 28 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
PHP实现变色验证码实例
Jan 06 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
PHP基于yii框架实现生成ICO图标
Nov 13 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
php微信公众号开发模式详解
Nov 28 PHP
php 后端实现JWT认证方法示例
Sep 04 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
phpstudy隐藏index.php的方法
Sep 21 PHP
理解PHP中的stdClass类
Apr 18 #PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
Apr 17 #PHP
php实现的漂亮分页方法
Apr 17 #PHP
codeigniter中测试通过的分页类示例
Apr 17 #PHP
php生成静态页面的简单示例
Apr 17 #PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 #PHP
php实现12306余票查询、价格查询示例
Apr 17 #PHP
You might like
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
PHP strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
利用js对象弹出一个层
2008/03/26 Javascript
JQuery-tableDnD 拖拽的基本使用介绍
2013/07/04 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
详解如何让InstantClick兼容MathJax、百度统计等
2017/09/12 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
js作用域和作用域链及预解析
2019/04/11 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
python的urllib模块显示下载进度示例
2014/01/17 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
墨西哥购物网站:Elektra
2020/01/21 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
解释下面关于J2EE的名词
2013/11/15 面试题
人力资源专业推荐信
2013/11/29 职场文书
保险内勤岗位职责
2014/04/05 职场文书
安全教育月活动总结
2014/05/05 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
因个人工作失误检讨书
2019/06/21 职场文书
导游词之无锡古运河
2019/11/14 职场文书