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

时间: 2024-09-17 08:39:31

从PHP的源码中深入了解stdClass类_php技巧的相关文章

PHP源码之 ext/mysql扩展部分_php技巧

我写过一个外部模块扩展,现在开始看PHP源码中的mysql扩展,它是可以被集成到PHP内部的,所以应该算是内置的扩展了. 该扩展需要用到mysql数据库提供的一些接口,所以需要安装了mysql,并能够确定mysql.h的位置. 该扩展的位置一般在 PHP-source-code/ext/mysql 下. 在linux下,主要需要注意的文件是: config.m4, php_mysql.c, php_mysql_structs.h. ps:该目录下有tags文件,所以可以利用ctags的各种特性,

深入理解PHP之源码目录结构与功能说明_php技巧

本文讲述了PHP源码目录结构与功能说明.分享给大家供大家参考,具体如下: PHP之所以能在web开发语言中排名靠前,不仅仅是因为语法简单,上手容易.我个人认为更多是因为其语言本身的:模块的易扩展性,可维护性以及内存安全管理等特点.写过PHP的程序员不一定都知道:PHP是如何执行的?其组织结构目录的作用?如果对其有所了解,对PHP的认识会更深入,写出的代码也会更高效,更健壮...... 1. build 和编译有关的目录. 2. ext 扩展库代码,例如 MySQL.zlib.iconv 等我们熟

修改Zend引擎实现PHP源码加密的原理及实践_php技巧

一.基本原理 考虑截获PHP读取源文件的接口.一开始,我考虑从Apache和PHP 之间的接口处处理,参见apache的src/modules/php4/mod_php4.c (这个是PHP用static方式编译进apache,make install 后的文件),在send_php()函数中截获文件指针,采用临时文件的方式,解密后替换文件指针.这种方法经过测试实践,证明是可行的.但是,必须使用两次文件操作,效率低下,而且对于DSO方式不可采用. 双缘敬老院 由此,重新考虑截获PHP读取文件并装

理解PHP中的stdClass类_php技巧

相信大家跟我一样,会经常看到和下面很类似的PHP代码: 复制代码 代码如下: $user = new stdClass();$user->name = 'gouki'; 这样的代码,这是干嘛用的呢?翻开手册,搜索stdClass,你会发现,手册上几乎没有介绍,如果你再次搜索google,看到的也几乎全是英文解释.其实,stdClass在PHP5才开始被流行.而stdClass也是zend的一个保留类.似乎没有其他作用.也几乎没有任何说明.或者,我们可以这么理解:stdClass是PHP的一个基类

php中文本操作的类_php技巧

给大家一个简单的文本操作的类  我以前写的,不过一直都没机会用了,文本不如数据库 数据是以行保存的,以\n结尾,注意你输入的数据必须以"\n"结尾的,这是几个最基本的类成员,文本的特别要注意效率问题,比如你要更新文件的2,3,4行,用: for($i=2;$i<=4;$i++)$this->update($file,$i,$msg);不如这样的: $data=$this->read($file); for($i=2;$i<=4;$i++)$data[$i]=$m

phpwind中的数据库操作类_php技巧

<?php /*来源:phpwind.net*/ Class DB { var $query_num = 0; function DB($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0) { $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect); } function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0) {

PHP5中新增stdClass 内部保留类_php技巧

stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法.stdClass类可以被继承,只是这样做没有什么意义. 该类是PHP的保留类,并不是所有类的基类. 复制代码 代码如下: <?php class foo {} $bar = new foo(); echo $bar instanceof stdClass?'yes':'no'; //output:no 另外一个例子: 复制代码 代码如下:

PHP实现html源码中回车换行输出

 在源码中输入换行但是不显示像br 之类的字符我们需要通过php地转义字符来实现了,下文就一起来看看吧.     知识扩充   转移序列 说明 n 换行 r 回车 t 水平制表符 [/td> 反斜线 $ 美元符号 " 双引号 [0-7]{1,3} 此正则表达式序列匹配一个用八进制符号表示的字符 x[0-9A-Fa-f]{1,2} 此正则表达式序列匹配一个用十六进制符号表示的字符   用双引号(")定义字符串,PHP 懂得更多特殊字符的转义序列: PHP默认页面编码为HTML,要使

hashmap-请教HashMap源码中的一些问题

问题描述 请教HashMap源码中的一些问题 final Entry getEntry(Object key) { // 获取哈希值 // HashMap将"key为null"的元素存储在table[0]位置,"key不为null"的则调用hash()计算哈希值 int hash = (key == null) ? 0 : hash(key.hashCode()); // 在"该hash值对应的链表"上查找"键值等于key"的