PHP5中新增stdClass 内部保留类


Posted in PHP onJune 13, 2011

stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法。stdClass类可以被继承,只是这样做没有什么意义。

该类是PHP的保留类,并不是所有类的基类。

<?php 
class foo {} 
$bar = new foo(); 
echo $bar instanceof stdClass?'yes':'no'; 
//output:no

另外一个例子:
<?php 
// CTest does not derive from stdClass 
class CTest { 
public $property1; 
} 
$t = new CTest; 
var_dump($t instanceof stdClass); // false 
var_dump(is_subclass_of($t, 'stdClass')); // false 
echo get_class($t) . "\n"; // 'CTest' 
echo get_parent_class($t) . "\n"; // false (no parent) 
?>

任何用(object)强制转换都会得到一个stdClass的实例。

理解PHP中的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类可以被继承,只是这样做没有什么意义。

官方手册参考:http://www.php.net/manual/en/language.oop5.basic.php#92123

PHP 相关文章推荐
由php的call_user_func传reference引发的思考
Jul 23 PHP
PHP基础知识回顾
Aug 16 PHP
php函数array_merge用法一例(合并同类数组)
Feb 03 PHP
php strrpos()与strripos()函数
Aug 31 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
Nov 03 PHP
twig里使用js变量的方法
Feb 05 PHP
Yii2 如何在modules中添加验证码的方法
Jun 19 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
May 23 PHP
漂亮的thinkphp 跳转页封装示例
Oct 16 PHP
Laravel ORM 数据model操作教程
Oct 21 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 #PHP
php中通过虚代理实现延迟加载的实现代码
Jun 10 #PHP
php获取后台Job管理的实现代码
Jun 10 #PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 #PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
Jun 10 #PHP
PHP网站备份程序代码分享
Jun 10 #PHP
php在页面中调用fckeditor编辑器的方法
Jun 10 #PHP
You might like
压力如何影响浓缩咖啡品质
2021/03/03 咖啡文化
留言板翻页的实现详解
2006/10/09 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
为你总结一些php信息函数
2015/10/21 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
Python使用代理抓取网站图片(多线程)
2014/03/14 Python
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
Pytorch 实现权重初始化
2019/12/31 Python
pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)
2020/01/18 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
在数据文件自动增长时,自动增长是否会阻塞对文件的更新
2014/05/01 面试题
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
中秋节礼品促销方案
2014/02/02 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
演讲稿开场白台词
2014/08/25 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android