从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购物网站支付paypal使用方法
Nov 28 PHP
windwos下使用php连接oracle数据库的过程分享
May 26 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
php中解析带中文字符的url函数分享
Jan 20 PHP
PHP中两个float(浮点数)比较实例分析
Sep 27 PHP
php示例详解Constructor Prototype Pattern 原型模式
Oct 15 PHP
Laravel5中Cookie的使用详解
May 03 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
php unlink()函数使用教程
Jul 12 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
Feb 20 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
Mar 18 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简单获取目录列表的方法
2015/03/24 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
2015/12/18 PHP
PHP中header用法小结
2016/05/23 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
2021/03/04 PHP
jquery 查找iframe父级页面元素的实现代码
2011/08/28 Javascript
js实现一个省市区三级联动选择框代码分享
2013/03/06 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
全面解析JavaScript中apply和call以及bind(推荐)
2016/06/15 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
js HTML5手机刮刮乐代码
2020/09/29 Javascript
解析js如何获取css样式
2016/12/11 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
详解小程序循环require之坑
2019/03/08 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
python实现的二叉树算法和kmp算法实例
2014/04/25 Python
在Python中增加和插入元素的示例
2018/11/01 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Python3实现飞机大战游戏
2020/04/24 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
如何撰写一封出色的求职信
2014/04/27 职场文书
推广普通话演讲稿
2014/05/23 职场文书
求职教师自荐书
2014/06/19 职场文书
父亲节活动策划方案
2014/08/24 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
庆祝教师节标语
2014/10/09 职场文书
手术室护士个人总结
2015/02/13 职场文书
搬迁通知
2015/04/20 职场文书
不同意离婚答辩状
2015/05/22 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
财务年终工作总结大全
2019/06/20 职场文书