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远程连接MYSQL数据库非常慢的解决方法
Jul 05 PHP
php处理json时中文问题的解决方法
Apr 12 PHP
php变量作用域的深入解析
Jun 03 PHP
ThinkPHP之foreach标签使用概述
Jun 30 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
CI配置多数据库访问的方法
Mar 28 PHP
PHP的AES加密算法完整实例
Jul 20 PHP
php常用数组函数实例小结
Dec 29 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
php中关于换行的实例写法
Sep 26 PHP
基于laravel Request的所有方法详解
Sep 29 PHP
Cookie跨域问题解决方案代码示例
Nov 24 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在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
php 文件上传类代码
2011/08/06 PHP
php mssql扩展SQL查询中文字段名解决方法
2012/10/15 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
php测试kafka项目示例
2020/02/06 PHP
突发奇想的一个jquery插件
2010/11/19 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
javascript的alert box在java中如何显示多行
2014/05/18 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
javascript+html5实现绘制圆环的方法
2015/07/28 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
webpack构建react多页面应用详解
2017/09/15 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
Python字符串处理实例详解
2017/05/18 Python
在Python中获取操作系统的进程信息
2019/08/27 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
寒假实习自荐信
2014/01/26 职场文书
《最大的“书”》教学反思
2014/02/14 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
经贸日语专业自荐信
2014/09/02 职场文书
小学体育组工作总结2015
2015/07/21 职场文书
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫