您好,登錄后才能下訂單哦!
php變量的實(shí)現(xiàn)方法?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
php變量的實(shí)現(xiàn)方法:首先聲明一個(gè)zval指針,并申請(qǐng)一塊內(nèi)存;然后通過【ZVAL_STRING】宏將值設(shè)置為bar;最后就是將這個(gè)zval加入到當(dāng)前的符號(hào)表里去,并將其label定義成foo。
php變量的實(shí)現(xiàn)方法:
簡(jiǎn)介
在官方的PHP實(shí)現(xiàn)內(nèi)部,所有變量使用同一種數(shù)據(jù)結(jié)構(gòu)(zval)來保存,而這個(gè)結(jié)構(gòu)同時(shí)表示PHP中的各種數(shù)據(jù)類型。 它不僅僅包含變量的值,也包含變量的類型。這就是PHP弱類型的核心。
標(biāo)量類型: boolean、integer、float(double)、string
復(fù)合類型: array、object
特殊類型: resource、NULL
變量的存儲(chǔ)結(jié)構(gòu)
PHP在內(nèi)核中是通過zval這個(gè)結(jié)構(gòu)體來存儲(chǔ)變量的,它的定義在Zend/zend.h文件里,簡(jiǎn)短精煉,只有四個(gè)成員組成:
struct _zval_struct { zvalue_value value; /* 變量的值 */ zend_uint refcount__gc; zend_uchar type; /* 變量當(dāng)前的數(shù)據(jù)類型 */ zend_uchar is_ref__gc; }; typedef struct _zval_struct zval; //在Zend/zend_types.h里定義的: typedef unsigned int zend_uint; typedef unsigned char zend_uchar;
refcount__gc 表示引用計(jì)數(shù) 1
is_ref__gc 表示是否為引用 0
value 存儲(chǔ)變量的值
type 變量具體的類型
變量的類型
zval結(jié)構(gòu)體的type字段就是實(shí)現(xiàn)弱類型最關(guān)鍵的字段,type的值可以為: IS_NULL
、IS_BOOL
、IS_LONG
、IS_DOUBLE
、IS_STRING
、IS_ARRAY
、IS_OBJECT
、IS_RESOURCE
。 從字面上就很好理解,他們只是類型的唯一標(biāo)示,根據(jù)類型的不同將不同的值存儲(chǔ)到value字段。 除此之外,和他們定義在一起的類型還有IS_CONSTANT
和IS_CONSTANT_ARRAY
。
示例
<?php $foo = 'bar'; ?>
上面是一段PHP語言的例子,創(chuàng)建一個(gè)變量,并把它的值設(shè)置為'bar',步驟: 創(chuàng)建一個(gè)zval結(jié)構(gòu),并設(shè)置其類型。 設(shè)置值為'bar'。 將其加入當(dāng)前作用域的符號(hào)表,這樣用戶才能在PHP里使用這個(gè)變量 具體的代碼為:
{ zval *fooval; MAKE_STD_ZVAL(fooval); ZVAL_STRING(fooval, "bar", 1); ZEND_SET_SYMBOL( EG(active_symbol_table) , "foo" , fooval); }
首先,我們聲明一個(gè)zval指針,并申請(qǐng)一塊內(nèi)存。然后通過ZVAL_STRING宏將值設(shè)置為bar,最后一行的作用就是將這個(gè)zval加入到當(dāng)前的符號(hào)表里去,并將其label定義成foo,這樣用戶就可以在代碼里通過$foo來使用它。
感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)php變量的實(shí)現(xiàn)方法大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。