从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
shopex中集成的站长统计功能的代码简单分析
Aug 11 PHP
php 短链接算法收集与分析
Dec 30 PHP
基于php设计模式中单例模式的应用分析
May 15 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
Drupal7中常用的数据库操作实例
Mar 02 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
destoon实现调用自增数字从1开始的方法
Aug 21 PHP
php ci 获取表单中多个同名input元素值的代码
Mar 25 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
Yii配置与使用memcached缓存的方法
Jul 13 PHP
thinkphp5实现微信扫码支付
Dec 23 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函数代码
2013/08/29 PHP
php修改数组键名的方法示例
2017/04/15 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
2020/04/06 PHP
Jquery uploadify图片上传插件无法上传的解决方法
2013/12/16 Javascript
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
详解Vue2.0配置mint-ui踩过的那些坑
2018/04/23 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
vue实现登录拦截
2020/06/29 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
Postman无法正常返回结果问题解决
2020/08/28 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
Python中使用PDB库调试程序
2015/04/05 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
python运行其他程序的实现方法
2017/07/14 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
django foreignkey(外键)的实现
2019/07/29 Python
Python语言异常处理测试过程解析
2020/01/08 Python
python-OpenCV 实现将数组转换成灰度图和彩图
2020/01/09 Python
python对文件的操作方法汇总
2020/02/28 Python
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
HTML5公共页面提取作为公用代码的方法
2020/06/30 HTML / CSS
联想英国官网:Lenovo英国
2019/07/17 全球购物
成教自我鉴定
2013/10/27 职场文书
机关财务管理制度
2014/01/17 职场文书
工地宣传标语
2014/06/18 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
老龙头导游词
2015/02/11 职场文书
2015年商场工作总结
2015/04/27 职场文书
python实现批量移动文件
2021/04/05 Python