从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 相关文章推荐
dede3.1分页文字采集过滤规则详说(图文教程)
Apr 03 PHP
php反弹shell实现代码
Apr 22 PHP
PHP XML备份Mysql数据库
May 27 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
Dec 25 PHP
PHP CURL 多线程操作代码实例
May 13 PHP
php实现将上传word文件转为html的方法
Jun 03 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
使用Composer安装Yii框架的方法
Mar 15 PHP
PHP链表操作简单示例
Oct 15 PHP
PHP中的密码加密的解决方案总结
Oct 26 PHP
php中html_entity_decode实现HTML实体转义
Jun 13 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
Apr 16 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
用PHP实现小写金额转换大写金额的代码(精确到分)
2012/01/10 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP函数引用返回的实例详解
2016/09/11 PHP
Zend Framework入门应用实例详解
2016/12/11 PHP
js 获取input点选按钮的值的方法
2014/04/14 Javascript
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
JavaScript SweetAlert插件实现超酷消息警告框
2016/01/28 Javascript
JS判断日期格式是否合法的简单实例
2016/07/11 Javascript
文件上传,iframe跨域数据提交的实现
2016/11/18 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
2019/10/31 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
JSON Web Tokens的实现原理
2017/04/02 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
Java程序开发中如何应用线程
2016/03/03 面试题
体育专业学生自我评价范文
2014/01/17 职场文书
卫生安全检查制度
2014/02/04 职场文书
六五普法规划实施方案
2014/03/21 职场文书
综合实践活动报告
2015/02/05 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python