摘要:大家都知道是一個弱類型的語言,變量的類型是隨著賦值的類型變化的,的底層是用寫的,本身是一個強類型的語言,那在底層是怎么實現類型的呢其實在底層,是通過一個結構體來存儲所有的變量的。
大家都知道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里面,和整數存儲師一樣的。這里大家應該想到==和===對于false和0處理的不同之處了。
????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
摘要:對于來說,變量有全局變量和局部變量之分那么,他們都是存儲到一個哈希表內了么其實不是的,變量存儲也有作用域的概念。 上次跟大家講了垃圾回收機制后,有些小伙伴對底層原理比較感興趣,私信問我了一些關于變量的相關知識,既然大家對變量比較感興趣,那么這次我們來系統的講一下變量的底層原理 變量結構 首先,我們還是先擺上我們的zval結構體,即php所有變量都會以zval結構體的形式實現 struc...
摘要:所以想要理解更深入的同學最好查看下我之前的關于介紹變量函數的文章類的數據結構不管是普通類還是抽象類或是接口,都存放到統一的結構體中,并且在生成中間代碼時,會將此類添加到全局類列表中。 對于PHPer來說,OOP是不可或缺的開發思維,但是你對php類和對象的底層實現又了解多少呢?本著知其然且知其所以然的思想,讓我們一起來尋找答案~ 類的底層實現可看作是之前我們講過的變量、函數等的知識集合...
摘要:數組是最常用的數據類型,同時容易上手也得益于其強大的數組,但是數組在中是如何實現的呢首先,我們還是先了解下相關的數據結構,為下面的內容打好基礎哈希表哈希表,顧名思義,即將不同的關鍵字映射到不同單元的一種數據結構。 數組是PHPer最常用的數據類型,同時php容易上手也得益于其強大的數組,但是數組在php中是如何實現的呢? 首先,我們還是先了解下相關的數據結構,為下面的內容打好基礎 哈希...
摘要:但是對于結構體中的和字段我們一直都沒有詳細介紹過,而這兩個字段其實是和變量之間賦值的原理有著密切的關系的。 上周我們從底層的角度介紹了php變量從生成->常量賦值->銷毀的完整生命周期(不了解的同學可以翻看一下前面的文章php底層原理之變量(一)),但是我們留了一個思考,不知道大家有答案了沒,變量之間的賦值在底層又是如何實現的呢? 變量之間賦值 php變量的zval結構,我們已經介紹了...
閱讀 3072·2021-10-27 14:16
閱讀 2882·2021-09-24 10:33
閱讀 2291·2021-09-23 11:21
閱讀 3234·2021-09-22 15:14
閱讀 818·2019-08-30 15:55
閱讀 1681·2019-08-30 15:53
閱讀 1749·2019-08-29 11:14
閱讀 2194·2019-08-28 18:11