从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 相关文章推荐
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
php之Memcache学习笔记
Jun 17 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
PHP实现的sqlite数据库连接类
Dec 12 PHP
CodeIgniter表单验证方法实例详解
Mar 03 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
基于php判断客户端类型
Oct 14 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
Oct 18 PHP
php自动加载代码实例详解
Feb 26 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
Zend Framework 2.0事件管理器(The EventManager)入门教程
2014/08/11 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
PHP判断访客是否手机端(移动端浏览器)访问的方法总结【4种方法】
2019/03/27 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
JavaScript中的事件处理
2008/01/16 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
jQuery实现无限往下滚动效果代码
2016/04/16 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
详解Python pygame安装过程笔记
2017/06/05 Python
Python定时器实例代码
2017/11/01 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python实现beta分布概率密度函数的方法
2019/07/08 Python
python监控nginx端口和进程状态
2019/09/06 Python
django 读取图片到页面实例
2020/03/27 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
建筑工程毕业生自我鉴定
2014/01/14 职场文书
2014年大学生自我评价
2014/01/19 职场文书
学校后勤岗位职责
2014/02/19 职场文书
对教师的评语
2014/04/28 职场文书
社会公德演讲稿
2014/05/20 职场文书
律师授权委托书范本
2014/10/07 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
红色影片观后感
2015/06/18 职场文书
邓小平文选读书笔记
2015/06/29 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书