从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 相关文章推荐
PHP如何解决网站大流量与高并发的问题
Jun 25 PHP
php输出xml格式字符串(用的这个)
Jul 12 PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
一个非常完美的读写ini格式的PHP配置类分享
Feb 12 PHP
Yii2.0中的COOKIE和SESSION用法
Aug 12 PHP
PHP调试及性能分析工具Xdebug详解
Feb 09 PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 PHP
php静态成员方法和静态的成员属性的使用方法
Oct 26 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 PHP
laravel 使用事件系统统计浏览量的实现
Oct 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
ASP知识讲座四
2006/10/09 PHP
如何利用php+mysql保存和输出文件
2006/10/09 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
smarty内置函数config_load用法实例
2015/01/22 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
jQuery上传多张图片带进度条样式(DEMO)
2017/03/02 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Django实现快速分页的方法实例
2017/10/22 Python
python爬取微信公众号文章的方法
2019/02/26 Python
Pytorch .pth权重文件的使用解析
2020/02/14 Python
Django 拼接两个queryset 或是两个不可以相加的对象实例
2020/03/28 Python
Python嵌入C/C++进行开发详解
2020/06/09 Python
如何卸载python插件
2020/07/08 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
出国签证在职证明
2014/01/16 职场文书
教师年度考核自我鉴定
2014/01/19 职场文书
物流专业自荐信
2014/05/23 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle