从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作的文本留言本的例子(六)
Oct 09 PHP
如何使用PHP中的字符串函数
Nov 24 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
PHP开发微信支付的代码分享
May 25 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
PHP获取一年中每个星期的开始和结束日期的方法
Feb 12 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
浅谈PHP中output_buffering
Jul 13 PHP
PHP中抽象类、接口的区别与选择分析
Mar 29 PHP
php版微信js-sdk支付接口类用法示例
Oct 12 PHP
Linux平台PHP5.4设置FPM线程数量的方法
Nov 09 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 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/02/17 PHP
ThinkPHP文件上传实例教程
2014/08/22 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
PHP学习记录之数组函数
2018/06/01 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
ThinkPHP5+Layui实现图片上传加预览功能
2018/08/17 PHP
sina的lightbox效果。
2007/01/09 Javascript
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
Bootstrap按钮组简单实现代码
2017/03/06 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
深入理解Vuex 模块化(module)
2017/09/26 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
微信小程序支付前端源码
2018/08/29 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[01:53]2016完美“圣”典风云人物:Maybe专访
2016/12/05 DOTA
wtfPython—Python中一组有趣微妙的代码【收藏】
2018/08/31 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
Python3运算符常见用法分析
2020/02/14 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
市场营销求职信范文
2014/02/21 职场文书
学校评语大全
2014/05/06 职场文书
企业文化理念标语
2014/06/10 职场文书
2014年艾滋病防治工作总结
2014/12/10 职场文书
公司文体活动总结
2015/05/07 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server
Go gorilla securecookie库的安装使用详解
2022/08/14 Golang