从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运算符的知识大全
Nov 03 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
thinkPHP实现MemCache分布式缓存功能
Mar 23 PHP
php遍历解析xml字符串的方法
May 05 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
php微信开发之关注事件
Jun 14 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 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 CURL 多线程操作代码实例
2015/05/13 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
jQuery中与toggleClass等价的程序段 以及未来学习的方向
2010/03/18 Javascript
jQuery 学习第六课 实现一个Ajax的TreeView
2010/05/17 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
分享15个最受欢迎的Python开源框架
2014/07/13 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
Python文本处理之按行处理大文件的方法
2018/04/09 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
详解python破解zip文件密码的方法
2020/01/13 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
一篇.NET面试题
2014/09/29 面试题
机电一体化应届生求职信范文
2014/01/24 职场文书
个人求职信范文分享
2014/01/31 职场文书
人事专员岗位职责
2015/02/03 职场文书
SpringCloud Alibaba 基本开发框架搭建过程
2021/06/13 Java/Android