【PHP學習】PHP7的資料類型
PHP中變數名稱→zval,變數值→zend_value。其變數記憶體是透過引用計數管理的,在PHP7中引用計數在value結構中。
變數類型:
頭檔在PHP原始碼/zend/zend_types.h
內部實作:
# PHP透過zval這個結構體來表示一個變量,而不同類型的變數值則透過zval嵌入的一個人聯合體表示,即zend_value。
zend_value是一個聯合體,其程式碼如下:
#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值用來對應元素的儲存位置。
雜湊函數:根據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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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

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