从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 相关文章推荐
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 PHP
文件上传程序的全部源码
Oct 09 PHP
PHP的面试题集
Nov 19 PHP
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
强制PHP命令行脚本单进程运行的方法
Apr 15 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 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 addslashes()与addclashes()函数的区别和比较
2013/06/24 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
jQuery的强大选择器小结
2009/12/27 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
jquery跟随屏幕滚动效果的实现代码
2016/04/13 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
如何在 Vue.js 中使用第三方js库
2017/04/25 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
js数组常用最重要的方法
2018/02/04 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
在vscode中启动conda虚拟环境的思路详解
2020/12/25 Python
推荐WEB开发者最佳HTML5和CSS3代码生成器
2015/11/24 HTML / CSS
LUISAVIAROMA德国官网:时尚奢侈品牌购物网站
2020/11/12 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
高中毕业自我鉴定
2013/12/16 职场文书
表扬信格式
2014/01/12 职场文书
小学开学寄语
2014/01/19 职场文书
管理专员自荐信
2014/01/26 职场文书
元旦晚会邀请函
2014/01/27 职场文书
物流管理专业毕业生自荐信
2014/03/04 职场文书
演讲主持词
2014/03/18 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
赞助商致辞
2015/07/30 职场文书
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫
JavaScript实现简单的音乐播放器
2022/08/14 Javascript