PHP 資料型別

2022-04-29 19:00:09 字數 1462 閱讀 5535

php中的變數名和變數值分別對應的是zval、zend_value,變數的記憶體是通過引用計數進行管理的,php7將引用計數轉移到了value中,變數之間的傳遞賦值也是針對zend_value

php7將布林型別直接分成了true 、false 兩種型別,直接通過type型別劃分,因此不需要具體的value。

php中字串沒有通過char型別,而是通過zend_string結果,zend_value中通過str指向具體的結構,zend_string除了字串內容外還有其他具體的資訊:

gc:變數的引用計數資訊,用於記憶體管理

h:字串通過time33演算法得到的hashcode,

len:字串的長度

val:字串的內容

特殊:儲存字串的內容用了乙個可變陣列,變長結構體不僅可以節省一次記憶體的分配,還有助於記憶體管理,free時直接釋放zend_string即可,需要注意的是儲存字串結尾會有乙個結束富豪"\0"

陣列的底層是雜湊表也成雜湊表,它是根據key-value直接訪問的資料結構,它的key-value之間存在對映函式,也就是根據key通過對映函式直接索引到對應的value值,也就是說通過key直接對映到記憶體中,從而加快了查詢速度,理想情況下可以直接知道到待查關鍵字。

buckey的結構比較簡單,就是key和value,如果元素是數值索引,那它的值就是數值索引的值,如果元素是字串,那它的key就是通過time33得到的雜湊值。

陣列的基本實現:雜湊表主要有兩部分組成,儲存元素陣列,雜湊函式,乙個簡單的雜湊函式是通過取模的方式,比如雜湊表的大小是8,那麼雜湊表初始化元素的時候就給陣列分配8個元素大小的空間,根據key的hashcode與8取模得到的值就是該元素的下標,這樣就可以通過key對映到儲存陣列的具體位置。這樣實現有個問題就是元素在陣列中的位置是隨機的,無序的,php陣列是有序的,為了讓雜湊表實現有序性,php中的雜湊表在雜湊函式與元素陣列之間加了一層對映表,這個對映表也是乙個陣列,大小與儲存元素的陣列相同,它的儲存元素是整型,用於儲存實際的儲存的有序陣列的下標,元素按照先後順序一次插入實際儲存陣列,然後將其陣列下標按照雜湊函式列出來的位置儲存在新加的對映表中。

以上就是陣列的底層實現原理,但是又會出現乙個問題就是雜湊衝突,因為time33($key)%size 可能得到的值相同,解決就是將衝突的bucket串成鍊錶。這裡需要注意的是把舊的放到鍊錶中,用新的替換舊的。

查詢過程:首先根據key計算出來hashcode以及雜湊值,然後根據雜湊值從中間對映表中得到儲存元素在有序儲存元素的位置idx,接著根據idx從有序村粗陣列中取出bucket,最後從取出的bucket看 i 啊餱 i遍歷,判斷bucket的key是否就是要查詢的key,如果是終止遍歷,否則繼續根據zend.u2.next(用來存放衝突的上面我說的舊的)遍歷比較。

擴容:php的陣列實現了自動擴容,在插入首先會檢查是否又空閒空間,當發現空間已滿沒有位置容納新元素時就會觸發擴容邏輯,擴容之後再執行插入。

引用:陣列使用引用時需要注意,引用只能通過&產生,無法通過賦值傳遞,php的引用只是一級。

php偽資料資料型別 PHP的資料型別

php的資料型別 資料型別 整體劃分 標量型別 int,float,string,bool 復合型別 array,object 特殊型別 null,resouce 整數型別int,integer 3種整數表示法 十進位制寫法 123 n1 123 八進位制寫法 0123 n2 0123 十六進製制寫...

PHP 資料型別

php 支援8種基本的資料型別。四種標量型別 boolean 布林型 integer 整型 float 浮點型,也稱作 double string 字串 兩種復合型別 array 陣列 object 物件 最後是兩種特殊型別 resource 資源 null null 為了確保 的易讀性,本手冊還介...

PHP 資料型別

要明確地將乙個值轉換成 boolean 用 bool 或者 boolean 來強制轉換。但是很多情況下不需要用強制轉換,因為當運算子,函式或者流程控制結構需要乙個boolean 引數時,該值會被自動轉換。參見型別轉換的判別。當轉換為 boolean 時,以下值被認為是false warning浮點數...