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 相关文章推荐
一个用php3编写的简单计数器
Oct 09 PHP
利用PHP和AJAX创建RSS聚合器的代码
Mar 13 PHP
php读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
Jul 31 PHP
php安全开发 添加随机字符串验证,防止伪造跨站请求
Feb 14 PHP
php二维数组排序与默认自然排序的方法介绍
Apr 27 PHP
PHP代码优化的53个细节
Mar 03 PHP
php如何解决无法上传大于8M的文件问题
Mar 10 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
Nov 05 PHP
PHP-FPM运行状态的实时查看及监控详解
Nov 18 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
PHP封装cURL工具类与应用示例
Jul 01 PHP
详解phpstorm2020最新破解方法
Sep 17 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
在Windows版的PHP中使用ADO
2006/10/09 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
js一组验证函数
2008/12/20 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
jQuery EasyUI API 中文文档 - Form表单
2011/10/06 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
Textarea输入字数限制实例(兼容iOS&amp;安卓)
2017/07/06 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
原生js中ajax访问的实例详解
2017/09/19 Javascript
vue解决使用webpack打包后keep-alive不生效的方法
2018/09/01 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
python持久性管理pickle模块详细介绍
2015/02/18 Python
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
解读Python编程中的命名空间与作用域
2015/10/16 Python
Python中property函数用法实例分析
2018/06/04 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
python 正则表达式参数替换实例详解
2020/01/17 Python
Python错误的处理方法
2020/06/23 Python
python 监控logcat关键字功能
2020/09/04 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
《海伦?凯勒》教学反思
2014/04/17 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
汇报材料怎么写
2014/12/30 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
php7中停止php-fpm服务的方法详解
2021/05/09 PHP