国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php底層變量的實(shí)現(xiàn)

hover_lew / 793人閱讀

摘要:大家都知道是一個弱類型的語言,變量的類型是隨著賦值的類型變化的,的底層是用寫的,本身是一個強(qiáng)類型的語言,那在底層是怎么實(shí)現(xiàn)類型的呢其實(shí)在底層,是通過一個結(jié)構(gòu)體來存儲所有的變量的。

大家都知道php是一個弱類型的語言,變量的類型是隨著賦值的類型變化的,php的底層是用C寫的,C本身是一個強(qiáng)類型的語言,那php在底層是怎么實(shí)現(xiàn)類型的呢?

其實(shí)在底層,php是通過一個結(jié)構(gòu)體來存儲所有的變量的。結(jié)構(gòu)體如下:

typedef struct _zval_struct zval

typedef struct _zval_struct {
    /* Variable information */
    zvalue_value value;
    zend_uint refcount_gc;
    zend_uchar type;
    zend_uint is_ref_gc;
}

解釋一下幾個變量的意義:
zend_value value 儲存的值,此處是一個指針,指到一個union的指針。php本身的值就是存儲在這個聯(lián)合體中。
zend_uint is_refcount 存儲的是引用計(jì)數(shù)
zend_uchar type 存儲變量的類型。
zend_uint is_ref_gc 是否是引用傳值。

php中所有的結(jié)構(gòu)都是從用這個結(jié)構(gòu)實(shí)現(xiàn)的。其中最關(guān)鍵的字段就是里面的type字段了。
type字段總共有7個值,分別是IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,ISARRAY,IS_OBJECT,IS_RESOURCE
這個里面包含了所有的php基本類型:

    標(biāo)量類型:IS_BOOL,IS_lONG,IS_DOUBLE,IS_STRING
    復(fù)合類型:IS_ARRAY,IS_OBJECT
    特殊類型:IS_RESOURCE,IS_NULL

zval結(jié)構(gòu)根據(jù)不同的類型,其zval結(jié)構(gòu)中的zval字段指向的聯(lián)合體中存儲不同的值.這個聯(lián)合體就是php中同一個變量可以存儲不同的值的關(guān)鍵.結(jié)構(gòu)如下:

typedef union _zval_value{
    long *lval;
    double *dval;
    struct {
        char *val;
        int len;
    }str;
    HashTable *ht;
    zend_object_value obj;
}

從這個結(jié)構(gòu)里可以看出php中所有變量的痕跡:
????IS_BOOL(boolen),是存儲在lval里面,和整數(shù)存儲師一樣的。這里大家應(yīng)該想到=====對于false0處理的不同之處了。
????IS_LONG(整型),存儲在lval
????IS_DOUBLE(浮點(diǎn)型),存儲在dval
????IS_STRING(字符串),存儲在str
????IS_ARRAY(數(shù)組),存儲在*ht哈希table中
????IS_OBJECT(對象),存儲在zend_object_value
????IS_NULL,NULL值在這個結(jié)構(gòu)中不用存儲,直接在zval結(jié)構(gòu)中的type字段進(jìn)行判斷。

簡單的介紹一下字符串的存儲:
字符串的在聯(lián)合體中使用結(jié)構(gòu)體的形式出現(xiàn),代碼如下:


struct {
    char *val;
    int len;
}str;

可以看到,php在存儲字符串時,將字符串的內(nèi)容和長度都存了起來,這是為了避免重復(fù)計(jì)算字符串的長度。php中的函數(shù)strlen,就是直接返回了這個長度。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/20817.html

相關(guān)文章

  • php底層原理之變量(一)

    摘要:對于來說,變量有全局變量和局部變量之分那么,他們都是存儲到一個哈希表內(nèi)了么其實(shí)不是的,變量存儲也有作用域的概念。 上次跟大家講了垃圾回收機(jī)制后,有些小伙伴對底層原理比較感興趣,私信問我了一些關(guān)于變量的相關(guān)知識,既然大家對變量比較感興趣,那么這次我們來系統(tǒng)的講一下變量的底層原理 變量結(jié)構(gòu) 首先,我們還是先擺上我們的zval結(jié)構(gòu)體,即php所有變量都會以zval結(jié)構(gòu)體的形式實(shí)現(xiàn) struc...

    curlyCheng 評論0 收藏0
  • php底層原理之類和對象

    摘要:所以想要理解更深入的同學(xué)最好查看下我之前的關(guān)于介紹變量函數(shù)的文章類的數(shù)據(jù)結(jié)構(gòu)不管是普通類還是抽象類或是接口,都存放到統(tǒng)一的結(jié)構(gòu)體中,并且在生成中間代碼時,會將此類添加到全局類列表中。 對于PHPer來說,OOP是不可或缺的開發(fā)思維,但是你對php類和對象的底層實(shí)現(xiàn)又了解多少呢?本著知其然且知其所以然的思想,讓我們一起來尋找答案~ 類的底層實(shí)現(xiàn)可看作是之前我們講過的變量、函數(shù)等的知識集合...

    isaced 評論0 收藏0
  • PHP_底層分析

    摘要:將會產(chǎn)生強(qiáng)制分裂結(jié)構(gòu)體結(jié)構(gòu)體引用數(shù)組時的一些奇怪現(xiàn)象引用數(shù)組時的怪現(xiàn)象數(shù)組不會比較細(xì)致的檢查,多維數(shù)組存在。因此,判斷的時候,只會判斷外面一層的結(jié)構(gòu)體。中底層都離不開表。底層所有的變量都是放在中。 PHP編譯特點(diǎn) 編譯型語言 對于C語言,C++,編譯成機(jī)器碼(二進(jìn)制)來運(yùn)行。Java語言,把.java 編譯成.class, 稱為bytecode(字節(jié)碼),由jvm來運(yùn)行 解釋型語言 解...

    tomlingtm 評論0 收藏0
  • php底層原理之?dāng)?shù)組實(shí)現(xiàn)

    摘要:數(shù)組是最常用的數(shù)據(jù)類型,同時容易上手也得益于其強(qiáng)大的數(shù)組,但是數(shù)組在中是如何實(shí)現(xiàn)的呢首先,我們還是先了解下相關(guān)的數(shù)據(jù)結(jié)構(gòu),為下面的內(nèi)容打好基礎(chǔ)哈希表哈希表,顧名思義,即將不同的關(guān)鍵字映射到不同單元的一種數(shù)據(jù)結(jié)構(gòu)。 數(shù)組是PHPer最常用的數(shù)據(jù)類型,同時php容易上手也得益于其強(qiáng)大的數(shù)組,但是數(shù)組在php中是如何實(shí)現(xiàn)的呢? 首先,我們還是先了解下相關(guān)的數(shù)據(jù)結(jié)構(gòu),為下面的內(nèi)容打好基礎(chǔ) 哈希...

    HackerShell 評論0 收藏0
  • php底層原理之變量(二)

    摘要:但是對于結(jié)構(gòu)體中的和字段我們一直都沒有詳細(xì)介紹過,而這兩個字段其實(shí)是和變量之間賦值的原理有著密切的關(guān)系的。 上周我們從底層的角度介紹了php變量從生成->常量賦值->銷毀的完整生命周期(不了解的同學(xué)可以翻看一下前面的文章php底層原理之變量(一)),但是我們留了一個思考,不知道大家有答案了沒,變量之間的賦值在底層又是如何實(shí)現(xiàn)的呢? 變量之間賦值 php變量的zval結(jié)構(gòu),我們已經(jīng)介紹了...

    bladefury 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<