摘要:大家都知道是一個(gè)弱類(lèi)型的語(yǔ)言,變量的類(lèi)型是隨著賦值的類(lèi)型變化的,的底層是用寫(xiě)的,本身是一個(gè)強(qiáng)類(lèi)型的語(yǔ)言,那在底層是怎么實(shí)現(xiàn)類(lèi)型的呢其實(shí)在底層,是通過(guò)一個(gè)結(jié)構(gòu)體來(lái)存儲(chǔ)所有的變量的。
大家都知道php是一個(gè)弱類(lèi)型的語(yǔ)言,變量的類(lèi)型是隨著賦值的類(lèi)型變化的,php的底層是用C寫(xiě)的,C本身是一個(gè)強(qiáng)類(lèi)型的語(yǔ)言,那php在底層是怎么實(shí)現(xiàn)類(lèi)型的呢?
其實(shí)在底層,php是通過(guò)一個(gè)結(jié)構(gòu)體來(lái)存儲(chǔ)所有的變量的。結(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; }
解釋一下幾個(gè)變量的意義:
zend_value value 儲(chǔ)存的值,此處是一個(gè)指針,指到一個(gè)union的指針。php本身的值就是存儲(chǔ)在這個(gè)聯(lián)合體中。
zend_uint is_refcount 存儲(chǔ)的是引用計(jì)數(shù)
zend_uchar type 存儲(chǔ)變量的類(lèi)型。
zend_uint is_ref_gc 是否是引用傳值。
php中所有的結(jié)構(gòu)都是從用這個(gè)結(jié)構(gòu)實(shí)現(xiàn)的。其中最關(guān)鍵的字段就是里面的type字段了。
type字段總共有7個(gè)值,分別是IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,ISARRAY,IS_OBJECT,IS_RESOURCE。
這個(gè)里面包含了所有的php基本類(lèi)型:
標(biāo)量類(lèi)型:IS_BOOL,IS_lONG,IS_DOUBLE,IS_STRING 復(fù)合類(lèi)型:IS_ARRAY,IS_OBJECT 特殊類(lèi)型:IS_RESOURCE,IS_NULL
zval結(jié)構(gòu)根據(jù)不同的類(lèi)型,其zval結(jié)構(gòu)中的zval字段指向的聯(lián)合體中存儲(chǔ)不同的值.這個(gè)聯(lián)合體就是php中同一個(gè)變量可以存儲(chǔ)不同的值的關(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; }
從這個(gè)結(jié)構(gòu)里可以看出php中所有變量的痕跡:
????IS_BOOL(boolen),是存儲(chǔ)在lval里面,和整數(shù)存儲(chǔ)師一樣的。這里大家應(yīng)該想到==和===對(duì)于false和0處理的不同之處了。
????IS_LONG(整型),存儲(chǔ)在lval
????IS_DOUBLE(浮點(diǎn)型),存儲(chǔ)在dval
????IS_STRING(字符串),存儲(chǔ)在str
????IS_ARRAY(數(shù)組),存儲(chǔ)在*ht哈希table中
????IS_OBJECT(對(duì)象),存儲(chǔ)在zend_object_value
????IS_NULL,NULL值在這個(gè)結(jié)構(gòu)中不用存儲(chǔ),直接在zval結(jié)構(gòu)中的type字段進(jìn)行判斷。
簡(jiǎn)單的介紹一下字符串的存儲(chǔ):
字符串的在聯(lián)合體中使用結(jié)構(gòu)體的形式出現(xiàn),代碼如下:
struct { char *val; int len; }str;
可以看到,php在存儲(chǔ)字符串時(shí),將字符串的內(nèi)容和長(zhǎng)度都存了起來(lái),這是為了避免重復(fù)計(jì)算字符串的長(zhǎng)度。php中的函數(shù)strlen,就是直接返回了這個(gè)長(zhǎng)度。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/20817.html
摘要:對(duì)于來(lái)說(shuō),變量有全局變量和局部變量之分那么,他們都是存儲(chǔ)到一個(gè)哈希表內(nèi)了么其實(shí)不是的,變量存儲(chǔ)也有作用域的概念。 上次跟大家講了垃圾回收機(jī)制后,有些小伙伴對(duì)底層原理比較感興趣,私信問(wèn)我了一些關(guān)于變量的相關(guān)知識(shí),既然大家對(duì)變量比較感興趣,那么這次我們來(lái)系統(tǒng)的講一下變量的底層原理 變量結(jié)構(gòu) 首先,我們還是先擺上我們的zval結(jié)構(gòu)體,即php所有變量都會(huì)以zval結(jié)構(gòu)體的形式實(shí)現(xiàn) struc...
摘要:所以想要理解更深入的同學(xué)最好查看下我之前的關(guān)于介紹變量函數(shù)的文章類(lèi)的數(shù)據(jù)結(jié)構(gòu)不管是普通類(lèi)還是抽象類(lèi)或是接口,都存放到統(tǒng)一的結(jié)構(gòu)體中,并且在生成中間代碼時(shí),會(huì)將此類(lèi)添加到全局類(lèi)列表中。 對(duì)于PHPer來(lái)說(shuō),OOP是不可或缺的開(kāi)發(fā)思維,但是你對(duì)php類(lèi)和對(duì)象的底層實(shí)現(xiàn)又了解多少呢?本著知其然且知其所以然的思想,讓我們一起來(lái)尋找答案~ 類(lèi)的底層實(shí)現(xiàn)可看作是之前我們講過(guò)的變量、函數(shù)等的知識(shí)集合...
摘要:將會(huì)產(chǎn)生強(qiáng)制分裂結(jié)構(gòu)體結(jié)構(gòu)體引用數(shù)組時(shí)的一些奇怪現(xiàn)象引用數(shù)組時(shí)的怪現(xiàn)象數(shù)組不會(huì)比較細(xì)致的檢查,多維數(shù)組存在。因此,判斷的時(shí)候,只會(huì)判斷外面一層的結(jié)構(gòu)體。中底層都離不開(kāi)表。底層所有的變量都是放在中。 PHP編譯特點(diǎn) 編譯型語(yǔ)言 對(duì)于C語(yǔ)言,C++,編譯成機(jī)器碼(二進(jìn)制)來(lái)運(yùn)行。Java語(yǔ)言,把.java 編譯成.class, 稱為bytecode(字節(jié)碼),由jvm來(lái)運(yùn)行 解釋型語(yǔ)言 解...
摘要:數(shù)組是最常用的數(shù)據(jù)類(lèi)型,同時(shí)容易上手也得益于其強(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ù)類(lèi)型,同時(shí)php容易上手也得益于其強(qiáng)大的數(shù)組,但是數(shù)組在php中是如何實(shí)現(xiàn)的呢? 首先,我們還是先了解下相關(guān)的數(shù)據(jù)結(jié)構(gòu),為下面的內(nèi)容打好基礎(chǔ) 哈希...
摘要:但是對(duì)于結(jié)構(gòu)體中的和字段我們一直都沒(méi)有詳細(xì)介紹過(guò),而這兩個(gè)字段其實(shí)是和變量之間賦值的原理有著密切的關(guān)系的。 上周我們從底層的角度介紹了php變量從生成->常量賦值->銷(xiāo)毀的完整生命周期(不了解的同學(xué)可以翻看一下前面的文章php底層原理之變量(一)),但是我們留了一個(gè)思考,不知道大家有答案了沒(méi),變量之間的賦值在底層又是如何實(shí)現(xiàn)的呢? 變量之間賦值 php變量的zval結(jié)構(gòu),我們已經(jīng)介紹了...
閱讀 3080·2021-10-27 14:16
閱讀 2889·2021-09-24 10:33
閱讀 2297·2021-09-23 11:21
閱讀 3238·2021-09-22 15:14
閱讀 827·2019-08-30 15:55
閱讀 1689·2019-08-30 15:53
閱讀 1764·2019-08-29 11:14
閱讀 2197·2019-08-28 18:11