久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

PHP7的數(shù)據(jù)類型有哪些

這篇文章將為大家詳細(xì)講解有關(guān)PHP7的數(shù)據(jù)類型有哪些,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

公司專注于為企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、商城網(wǎng)站建設(shè),微信小程序開發(fā),軟件按需制作網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。

 PHP中變量名→zval,變量值→zend_value。其變量?jī)?nèi)存是通過引用計(jì)數(shù)管理的,在PHP7中引用計(jì)數(shù)在value結(jié)構(gòu)中。

變量類型:

頭文件在PHP源碼 /zend/zend_types.h

PHP7的數(shù)據(jù)類型有哪些

內(nèi)部實(shí)現(xiàn):

PHP通過zval這個(gè)結(jié)構(gòu)體來表示一個(gè)變量,而不同類型的變量值則通過zval嵌入的一個(gè)人聯(lián)合體表示,即zend_value。

PHP7的數(shù)據(jù)類型有哪些

PHP7的數(shù)據(jù)類型有哪些

zend_value是一個(gè)聯(lián)合體,其代碼如下:

PHP7的數(shù)據(jù)類型有哪些

ast、ptr、zv這些類型只給內(nèi)核自己使用。

字符串:

PHP為字符串單獨(dú)定義了一個(gè)結(jié)構(gòu):zend_string。在zend_value中通過str指向具體結(jié)構(gòu)。

PHP7的數(shù)據(jù)類型有哪些

PHP7的數(shù)據(jù)類型有哪些

PHP7的數(shù)據(jù)類型有哪些

存儲(chǔ)字符串內(nèi)容的val比較特殊。

val并沒有使用char*類型,字符串分配時(shí)是類似這樣操作的:malloc(sizeof(zend_sting)+字符串長(zhǎng)度),就是會(huì)多分配出一些內(nèi)存來存儲(chǔ)字符串內(nèi)容,這塊多出來的內(nèi)存起始位置就是val。

這樣做的好處可以省去一次內(nèi)存分配(char*),且更有助于內(nèi)存管理。

val中多出來的一個(gè)字節(jié)(結(jié)構(gòu)體中為val[1]而不是val[0])用于存儲(chǔ)存儲(chǔ)字符串的最后一個(gè)字符"\0"。

比如$a="abc",則對(duì)應(yīng)的zend_string內(nèi)存結(jié)構(gòu)如左圖:

數(shù)組:

PHP7的數(shù)據(jù)類型有哪些

PHP7的數(shù)據(jù)類型有哪些

nTableMask:這個(gè)值在散列函數(shù)根據(jù)key的hash code銀蛇元素的存儲(chǔ)為位置時(shí)用到。nTableMask = -nTableSize 或 nTableMask  = ~nTableSize+1。

nNumUsed、nNumOfElements:當(dāng)刪除數(shù)組元素時(shí)并不會(huì)立馬從數(shù)組中刪除,而是將這個(gè)元素的類型標(biāo)為IS_UNDEF,只有在數(shù)組容量超限,需要擴(kuò)容時(shí)才會(huì)刪除。

若沒有擴(kuò)容,則nNumUsed將一直遞增,所以其值并不是有效的元素?cái)?shù)。nNumOfElements則是數(shù)組中有效元素的數(shù)量,所以nNumOfElements ≤ nNumUsed。

Bucket結(jié)構(gòu)用力保存元素的key及value。而h是hash code:如果key是數(shù)值(及數(shù)值索引)那么它的值就是數(shù)值索引的值;如果key是字符串,那么它的值就是根據(jù)字符串key通過Time33算法計(jì)算得到的散列值。h值用來映射元素的存儲(chǔ)位置。

PHP7的數(shù)據(jù)類型有哪些

數(shù)組實(shí)現(xiàn):

為了實(shí)現(xiàn)散列表的有序性,PHP中的散列表在散列函數(shù)與元素?cái)?shù)組之間加了一層映射表,這個(gè)映射表也是數(shù)組,大小與存儲(chǔ)元素的數(shù)組相同。

中間映射表存儲(chǔ)元素在實(shí)際存儲(chǔ)的有序數(shù)組中的下標(biāo):元素按照先后順序依次插入實(shí)際存儲(chǔ)數(shù)組,然后將其數(shù)組下標(biāo)按照散列函數(shù)散列出來的位置存儲(chǔ)在新加的映射表中。

PHP7的數(shù)據(jù)類型有哪些

散列函數(shù):根據(jù)key映射出元素的的存儲(chǔ)位置,通常會(huì)以取模作為散列函數(shù):key->h % nTableSize。但PHP采用另一種方式:nIndex = key->h | nTableMask。

在PHP數(shù)組的結(jié)構(gòu)中并沒有發(fā)現(xiàn)這個(gè)中間映射表,事實(shí)上,它與arData放在一起。在數(shù)組初始化時(shí),同時(shí)分配用于存儲(chǔ)Bucket的內(nèi)存和分配相同數(shù)量的uint32_t大小的空間。然后將arData偏移到存儲(chǔ)元素?cái)?shù)組的位置。

中間映射表可以通過arData向前訪問到。

PHP7的數(shù)據(jù)類型有哪些

哈希沖突:不同的key值可能計(jì)算得到相同的哈希值,在插入散列表時(shí)會(huì)發(fā)生沖突,因?yàn)橛成浔碇荒艽鎯?chǔ)一個(gè)元素。

解決方法:把沖突的Bucket串成鏈表,即中間映射表映射出來的是一個(gè)Bucket鏈表,而不是一個(gè)Bucket,查找時(shí)需要遍歷這個(gè)鏈表,逐個(gè)比較key,從而找到目標(biāo)元素。

HashTable會(huì)記錄與它沖突的元素在arData數(shù)組中的存儲(chǔ)位置。

PHP7的數(shù)據(jù)類型有哪些

在設(shè)置映射值時(shí),發(fā)現(xiàn)中間映射表中要設(shè)置的位置已經(jīng)被之前插入的元素占用了(值不等于初始化的-1),那么會(huì)把已經(jīng)存在的值保存到新插入的Bucket中(即c插入后u2.next=0),然后將映射表中的值更新為新Bucket的存儲(chǔ)位置(即映射表中的值:2)。

引用:

引用是一種指向其他類型的結(jié)構(gòu),類似C語言中指針的概念。當(dāng)修改引用類型的變量時(shí),其修改將反應(yīng)到實(shí)際引用的變量上。

在PHP中通過&操作符生成一個(gè)引用變量,比如$b = &$a,執(zhí)行時(shí)首先為&操作的變量分配一個(gè)zend_reference結(jié)構(gòu),這個(gè)結(jié)構(gòu)就是引用類型的結(jié)構(gòu)體,它內(nèi)嵌了一個(gè)zval,此zval的value指向原來zval的value,然后將原zval的類型修改為IS_REFERENCE,原zval的value指向新創(chuàng)建的zend_reference結(jié)構(gòu)。

PHP7的數(shù)據(jù)類型有哪些

PHP7的數(shù)據(jù)類型有哪些

例子:

$a = date("Y-m");$b = &$a;

$a為字符串,通過&$a將其轉(zhuǎn)化為引用類型并賦值給了$b,轉(zhuǎn)換后的$a的類型由IS_STRING變?yōu)镮S_REFERENCE,$a的value也轉(zhuǎn)變?yōu)閦end_reference結(jié)構(gòu),這個(gè)結(jié)構(gòu)指向原來的字符串。

$a、$b間接指向了實(shí)際的value值。

PHP7的數(shù)據(jù)類型有哪些

使用引用時(shí)需要注意,引用只能通過&產(chǎn)生,不能通過賦值傳遞。

如上面的例子,再把$b賦值給其他變量,那么傳遞給新變量的value將是實(shí)際引用的值,而不是引用本身。

$a = date("Y-m");$b = &$a;$c = $b;   //如果想讓$c也引用指向$a/$b引用的值,則:$c = &$b

PHP7的數(shù)據(jù)類型有哪些

關(guān)于PHP7的數(shù)據(jù)類型有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

當(dāng)前名稱:PHP7的數(shù)據(jù)類型有哪些
本文地址:http://sd-ha.com/article18/jochdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站內(nèi)鏈、網(wǎng)站改版、品牌網(wǎng)站制作、網(wǎng)站營(yíng)銷、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站