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

資訊專欄INFORMATION COLUMN

php底層變量的實現

hover_lew / 790人閱讀

摘要:大家都知道是一個弱類型的語言,變量的類型是隨著賦值的類型變化的,的底層是用寫的,本身是一個強類型的語言,那在底層是怎么實現類型的呢其實在底層,是通過一個結構體來存儲所有的變量的。

大家都知道php是一個弱類型的語言,變量的類型是隨著賦值的類型變化的,php的底層是用C寫的,C本身是一個強類型的語言,那php在底層是怎么實現類型的呢?

其實在底層,php是通過一個結構體來存儲所有的變量的。結構體如下:

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本身的值就是存儲在這個聯合體中。
zend_uint is_refcount 存儲的是引用計數
zend_uchar type 存儲變量的類型。
zend_uint is_ref_gc 是否是引用傳值。

php中所有的結構都是從用這個結構實現的。其中最關鍵的字段就是里面的type字段了。
type字段總共有7個值,分別是IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,ISARRAY,IS_OBJECT,IS_RESOURCE
這個里面包含了所有的php基本類型:

    標量類型:IS_BOOL,IS_lONG,IS_DOUBLE,IS_STRING
    復合類型:IS_ARRAY,IS_OBJECT
    特殊類型:IS_RESOURCE,IS_NULL

zval結構根據不同的類型,其zval結構中的zval字段指向的聯合體中存儲不同的值.這個聯合體就是php中同一個變量可以存儲不同的值的關鍵.結構如下:

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

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

簡單的介紹一下字符串的存儲:
字符串的在聯合體中使用結構體的形式出現,代碼如下:


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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20817.html

相關文章

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

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

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

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

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

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

    tomlingtm 評論0 收藏0
  • php底層原理之數組實現

    摘要:數組是最常用的數據類型,同時容易上手也得益于其強大的數組,但是數組在中是如何實現的呢首先,我們還是先了解下相關的數據結構,為下面的內容打好基礎哈希表哈希表,顧名思義,即將不同的關鍵字映射到不同單元的一種數據結構。 數組是PHPer最常用的數據類型,同時php容易上手也得益于其強大的數組,但是數組在php中是如何實現的呢? 首先,我們還是先了解下相關的數據結構,為下面的內容打好基礎 哈希...

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

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

    bladefury 評論0 收藏0

發表評論

0條評論

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