从PHP的源码中深入了解stdClass类,内部保留类

在百度百科中,对于stdClass的概念如下:
复制代码 代码如下:
stdClass在PHP5才起来被风行。而stdClass也是zend的三个保留类。stdClass是PHP的一个基类,
具有的类大概都持续那些类,所以任什么日期候都可以被new,能够让这几个变量成为贰个object。同期,
本条基类又有三个非正规的地点,正是无法。凡是用new stdClass(State of Qatar的变量,
都不容许会现身$a->test(卡塔尔(قطر‎这种方法的应用。PHP5的指标的独天性,对象在别的地点被调用,
都以援用地址型的,所以相对消耗的能源会少一点。在别的页面为它赋值时是一向改进,而不是援用三个拷贝。

stdClass类是PHP的三个里头保留类,开端时不曾成员变量也没成员方法,全体的魔术点子都被安装为NULL,能够使用其传递变量参数,不过从未得以调用的方法。stdClass类可以被三翻五次,只是那样做未有怎么意义。

上述的概念大大多都以合情合理的,可是一个致命性的确诊错误:
stdClass是PHP的多个基类,全体的类差不离都持续那些类。 看三个轻便的例证:
复制代码 代码如下:
class EmptyClass {

该类是PHP的保留类,并不是全体类的基类。
复制代码 代码如下:
class foo {}
$bar = new foo();
echo $bar instanceof stdClass?’yes’:’no’;
//output:no

}

别的贰个事例:
复制代码 代码如下:
// 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 = new EmptyClass();
if ($object instanceof stdClass) {
    echo ‘yes’;
}else{
    echo ‘no’;
}

任何用(object卡塔尔国强迫转变都会获得一个stdClass的实例。

施行代码,输出”no”,那一个事例足够表达了stdClass类而不是全部类的基类。它可是是PHP的五个保留类,恐怕说一个像样于strlen函数那样的三个剧中人物。
我们从源码的维度看看stdClass类的兑现,它注册的岗位在
Zend/zend_buildin_functions.c文件中。如下:

理解PHP中的stdClass类

复制代码 代码如下:
ZEND_MINIT_FUNCTION(core) { /* {{{ */
    zend_class_entry class_entry;

stdClass在PHP5才起来被风行。而stdClass也是zend的叁个保留类。stdClass是PHP的叁个基类,
怀有的类差不离都持续这么些类,所以任几时候都得以被new,能够让那么些变量成为三个object。同不常间,
其一基类又有叁个特种的地方,正是没有章程。凡是用new stdClass(卡塔尔的变量,
都不容许会现出$a->test(卡塔尔国这种方法的选取。PHP5的对象的独脾性,对象在其余地方被调用,
都以援用地址型的,所以相对消耗的财富会少一点。在其余页面为它赋值时是直接修正,并非援用一个正片。

    /* 注册stdClass 类 */
    INIT_CLASS_ENTRY(class_entry, “stdClass”, NULL);
    zend_standard_class_def =
zend_register_internal_class(&class_entry TSRMLS_CC);

上述的概念大好多都是科学的,不过三个致命性的确诊错误:
stdClass是PHP的贰个基类,全体的类差不离都持续那些类。 看一个简单的例证:
复制代码 代码如下:
class EmptyClass {

发表评论

电子邮件地址不会被公开。 必填项已用*标注