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 相关文章推荐
用 PHP5 轻松解析 XML
Dec 04 PHP
在PHP中利用wsdl创建标准webservice的实现代码
Dec 07 PHP
PHP SPL使用方法和他的威力
Nov 12 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
php列出mysql表所有行和列的方法
Mar 13 PHP
php中关于socket的系列函数总结
May 18 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
php安装扩展mysqli的实现步骤及报错解决办法
Sep 23 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
Nov 23 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
PHP面向对象程序设计之接口用法
2014/08/20 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
firefox和IE系列的相关区别整理 以备后用
2009/12/28 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
不间断循环滚动效果的实例代码(必看篇)
2016/10/08 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
layui输入框中只允许输入整数的实现方法
2019/09/18 Javascript
原生JS实现天气预报
2020/06/16 Javascript
详解JavaScript 高阶函数
2020/09/14 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
Python实现登录人人网并抓取新鲜事的方法
2015/05/11 Python
Django imgareaselect手动剪切头像实现方法
2015/05/26 Python
python检测是文件还是目录的方法
2015/07/03 Python
Python实现公历(阳历)转农历(阴历)的方法示例
2017/08/22 Python
Python基于正则表达式实现文件内容替换的方法
2017/08/30 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
使用Python发现隐藏的wifi
2020/03/04 Python
pyecharts动态轨迹图的实现示例
2020/04/17 Python
python合并多个excel文件的示例
2020/09/23 Python
Autopep8的使用(python自动编排工具)
2021/03/02 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
领导的自我鉴定
2013/12/28 职场文书
小学体育教学反思
2014/01/31 职场文书
公司聘任书模板
2014/03/29 职场文书
小学优秀班主任材料
2014/12/17 职场文书
地道战观后感
2015/06/04 职场文书