目錄
變數類型:
內部實作:
引用:
首頁 後端開發 php教程 【PHP學習】PHP7的資料類型

【PHP學習】PHP7的資料類型

Apr 18, 2019 pm 04:29 PM
php7 資料類型

PHP中變數名稱→zval,變數值→zend_value。其變數記憶體是透過引用計數管理的,在PHP7中引用計數在value結構中。

變數類型:

頭檔在P​​HP原始碼/zend/zend_types.h

內部實作:

# PHP透過zval這個結構體來表示一個變量,而不同類型的變數值則透過zval嵌入的一個人聯合體表示,即zend_value。

 zend_value是一個聯合體,其程式碼如下:

##ast 、ptr、zv這些型別只給核心自己使用。

字串:

PHP為字串單獨定義了一個結構:zend_string。在zend_value中透過str指向具體結構。

#儲存字串內容的val較為特殊。

val並沒有使用char*類型,字串分配時是類似這樣操作的:malloc(sizeof(zend_sting) 字串長度),就是會多分配出一些記憶體來儲存字串內容,這塊多出來的記憶體起始位置就是val。

這樣做的好處可以省去一次記憶體分配(char*),而且更有助於記憶體管理。

val中多出來的一個位元組(結構體中為val[1]而不是val[0])用於儲存儲存字串的最後一個字元"\0"。

 例如$a="abc",則對應的zend_string記憶體結構如左圖:

 

 

 

陣列:

#nTableMask:這個值在雜湊函數根據key的hash code銀蛇元素的儲存為位置時用到。 nTableMask = -nTableSize 或 nTableMask  = ~nTableSize 1。

nNumUsed、nNumOfElements:當刪除陣列元素時並不會立刻從陣列中刪除,而是將這個元素的類型標為IS_UNDEF,只有在陣列容量超限,需要擴容時才會刪除。

若沒有擴容,則nNumUsed會一直遞增,所以其值並不是有效的元素數。 nNumOfElements則是數組中有效元素的數量,所以nNumOfElements ≤ nNumUsed。

Bucket結構用力保存元素的key及value。而h是hash code:如果key是數值(及數值索引)那麼它的值就是數值索引的值;如果key是字串,那麼它的值就是根據字串key透過Time33演算法計算得到的雜湊值。 h值用來對應元素的儲存位置。

陣列實作:

為了實現散列表的有序性,PHP中的散列表在雜湊函數與元素數組之間加了一層映射表,這個映射表也是數組,大小與儲存元素的數組相同。

中間映射表存儲元素在實際存儲的有序數組中的下標:元素按照先後順序依次插入實際存儲數組,然後將其數組下標按照散列函數散列出來的位置存儲在新加的映射表中。

雜湊函數:根據key對應出元素的的儲存位置,通常會以取模為雜湊函數:key->h % nTableSize。但PHP採取另一種方式:nIndex = key->h | nTableMask。

在PHP數組的結構中並沒有發現這個中間映射表,事實上,它與arData放在一起。在陣列初始化時,同時分配用於儲存Bucket的記憶體和分配相同數量的uint32_t大小的空間。然後將arData偏移到儲存元素數組的位置。

中間映射表可以透過arData向前存取。

         

#雜湊衝突:不同的key值可能會計算相同的雜湊值,插入雜湊時會發生衝突,因為對應表只能儲存一個元素。

解決方法:把衝突的Bucket串成鍊錶,也就是中間映射表映射出來的是Bucket鍊錶,而不是一個Bucket,查找時需要遍歷這個鍊錶,逐個比較key,從而找到目標元素。

HashTable會記錄與它衝突的元素在arData陣列中的儲存位置。

 在設定映射值時,發現中間映射表中要設定的位置已經被先前插入的元素佔用了(值不等於初始化的-1),那麼會把已經存在的值儲存到新插入的Bucket中(即c插入後u2.next=0),然後將映射表中的值更新為新Bucket的儲存位置(即映射表中的值:2)。

引用:

引用是一種指向其他類型的結構,類似C語言中指標的概念。當修改引用類型的變數時,其修改將反應到實際引用的變數上。

在PHP中透過&運算子產生一個引用變量,例如$b = &$a,執行時首先為&操作的變數分配一個zend_reference結構,這個結構就是引用類型的結構體,它內嵌了一個zval,此zval的value指向原來zval的value,然後將原始zval的型別修改為IS_REFERENCE,原zval的value指向新建立的zend_reference結構。

範例:


#
$a = date("Y-m");$b = &$a;
登入後複製

$a為字串,透過& $a將其轉換為引用型別並賦值給了$b,轉換後的$a的型別由IS_STRING變成IS_REFERENCE,$a的value也轉變為zend_reference結構,這個結構指向原來的字串。

$a、$b間接指向了實際的value值。 

 

使用引用時需要注意,引用只能透過&產生,不能透過賦值傳遞。

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


$a = date("Y-m");$b = &$a;$c = $b;   //如果想让$c也引用指向$a/$b引用的值,则:$c = &$b
登入後複製

推薦課程:PHP影片教學 

以上是【PHP學習】PHP7的資料類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
MySQL資料庫中性別欄位應該使用什麼資料類型? MySQL資料庫中性別欄位應該使用什麼資料類型? Mar 14, 2024 pm 01:21 PM

在MySQL資料庫中,性別欄位通常可以使用ENUM類型來儲存。 ENUM是一種枚舉類型,它允許我們在一組預先定義的值中選擇一個作為欄位的值。在表示性別這樣一個固定且有限的選項時,ENUM是一個很好的選擇。讓我們來看一個具體的程式碼範例:假設我們有一個名為"users"的表,其中包含了使用者的信息,包括性別。現在我們要為性別創建一個字段,我們可以這樣設計表結構:CRE

MySQL中最適合用於性別欄位的資料類型是什麼? MySQL中最適合用於性別欄位的資料類型是什麼? Mar 15, 2024 am 10:24 AM

在MySQL中,最適合用於性別欄位的資料類型是ENUM枚舉類型。 ENUM枚舉類型是一種允許定義一組可能取值的資料類型,性別欄位適合使用ENUM類型是因為性別通常只有兩個取值,即男性和女性。接下來,我將透過具體的程式碼範例來展示如何在MySQL中建立一個性別欄位並使用ENUM枚舉類型儲存性別資訊。以下是操作步驟:首先,在MySQL中建立一個名為users的表格,包括

php7.0安裝了插件還是顯示未安裝怎麼辦 php7.0安裝了插件還是顯示未安裝怎麼辦 Apr 02, 2024 pm 07:39 PM

解決 PHP 7.0 中插件未顯示已安裝問題的方法:檢查插件配置並啟用插件。重新啟動 PHP 以套用配置變更。檢查插件檔案權限,確保其正確。安裝遺失的依賴項,以確保插件正常運作。如果其他步驟都失敗,則重建 PHP。其他可能原因包括外掛程式版本不相容、載入錯誤版本或 PHP 配置問題。

Python 語法的心智圖:深入理解程式碼結構 Python 語法的心智圖:深入理解程式碼結構 Feb 21, 2024 am 09:00 AM

python憑藉其簡單易讀的語法,廣泛應用於廣泛的領域。掌握Python語法的基礎架構至關重要,既可以提高程式效率,又能深入理解程式碼的運作方式。為此,本文提供了一個全面的心智圖,詳細闡述了Python語法的各個面向。變數和資料類型變數是Python中用於儲存資料的容器。心智圖展示了常見的Python資料類型,包括整數、浮點數、字串、布林值和列表。每個資料類型都有其自身的特性和操作方法。運算符運算符用於對資料類型執行各種操作。心智圖涵蓋了Python中的不同運算子類型,例如算術運算子、比

MySQL中布林類型的使用方法詳解 MySQL中布林類型的使用方法詳解 Mar 15, 2024 am 11:45 AM

MySQL中布林類型的使用方法詳解MySQL是一種常用的關聯式資料庫管理系統,在實際應用中經常需要使用布林類型來表示邏輯上的真假值。 MySQL中布林類型有兩種表示法:TINYINT(1)和BOOL。本文將詳細介紹MySQL中布林類型的使用方法,包括布林類型的定義、賦值、查詢和修改等操作,同時結合具體的程式碼範例進行說明。 1.布林類型的定義在MySQL中,可

PHP 伺服器環境常見問題指南:快速解決常見難題 PHP 伺服器環境常見問題指南:快速解決常見難題 Apr 09, 2024 pm 01:33 PM

PHP伺服器環境常見的解決方法包括:確保已安裝正確的PHP版本和已複製相關檔案到模組目錄。暫時或永久停用SELinux。檢查並配置PHP.ini,確保已新增必要的擴充功能和進行正確設定。啟動或重新啟動PHP-FPM服務。檢查DNS設定是否有解析問題。

MySQL中性別欄位最佳資料類型選擇是什麼? MySQL中性別欄位最佳資料類型選擇是什麼? Mar 14, 2024 pm 01:24 PM

在設計資料庫表時,選擇合適的資料類型對於效能最佳化和資料儲存效率非常重要。在MySQL資料庫中,儲存性別欄位的資料類型真是沒有所謂的最佳選擇,因為性別欄位一般只有兩個取值:男或女。但是為了效率和節省空間,我們可以選擇合適的資料類型來儲存性別欄位。在MySQL中,儲存性別欄位最常用的資料類型是枚舉類型。枚舉類型是一種能夠把欄位的值限定在一個有限的集合內的資料型別

如何在系統重啟後自動設置unixsocket的權限? 如何在系統重啟後自動設置unixsocket的權限? Mar 31, 2025 pm 11:54 PM

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

See all articles