搜尋
首頁後端開發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刪除
php7检测tcp端口不好用怎么解决php7检测tcp端口不好用怎么解决Mar 22, 2023 am 09:30 AM

在php5中,我们可以使用fsockopen()函数来检测TCP端口。这个函数可以用来打开一个网络连接和进行一些网络通信。但是在php7中,fsockopen()函数可能会遇到一些问题,例如无法打开端口、无法连接到服务器等。为了解决这个问题,我们可以使用socket_create()函数和socket_connect()函数来检测TCP端口。

php7.0怎么安装mongo扩展php7.0怎么安装mongo扩展Nov 21, 2022 am 10:25 AM

php7.0安装mongo扩展的方法:1、创建mongodb用户组和用户;2、下载mongodb源码包,并将源码包放到“/usr/local/src/”目录下;3、进入“src/”目录;4、解压源码包;5、创建mongodb文件目录;6、将文件复制到“mongodb/”目录;7、创建mongodb配置文件并修改配置即可。

php7.0安装了插件还是显示未安装怎么办php7.0安装了插件还是显示未安装怎么办Apr 02, 2024 pm 07:39 PM

解决 PHP 7.0 中插件未显示已安装问题的方法:检查插件配置并启用插件。重新启动 PHP 以应用配置更改。检查插件文件权限,确保其正确。安装丢失的依赖项,以确保插件正常运行。如果其他步骤均失败,则重建 PHP。其他可能原因包括插件版本不兼容、加载错误版本或 PHP 配置问题。

php8和php7哪个好php8和php7哪个好Nov 16, 2023 pm 03:09 PM

PHP8相较于PHP7在性能、新特性和语法改进、类型系统、错误处理和扩展等方面都有一些优势和改进。然而,选择使用哪个版本要根据具体的需求和项目情况来决定。详细介绍:1、性能提升,PHP8引入了Just-in-Time(JIT)编译器,可以提高代码的执行速度;2、新特性和语法改进,PHP8支持命名参数和可选参数的声明,使得函数调用更加灵活;引入了匿名类、属性的类型声明等等。

php7.0怎么安装部署php7.0怎么安装部署Nov 30, 2022 am 09:56 AM

php7.0安装部署的方法:1、到PHP官网下载与本机系统对应的安装版本;2、将下载的zip文件解压到指定目录;3、打开命令行窗口,在“E:\php7”目录下运行“php -v”命令即可。

PHP 服务器环境常见问题指南:快速解决常见难题PHP 服务器环境常见问题指南:快速解决常见难题Apr 09, 2024 pm 01:33 PM

PHP服务器环境常见的解决方法包括:确保已安装正确的PHP版本和已复制相关文件到模块目录。临时或永久禁用SELinux。检查并配置PHP.ini,确保已添加必要的扩展和进行正确设置。启动或重启PHP-FPM服务。检查DNS设置是否存在解析问题。

php7怎么下载与安装(教程分享)php7怎么下载与安装(教程分享)Mar 23, 2023 pm 02:11 PM

随着互联网技术的发展,计算机编程语言也随之不断发展和更新。PHP作为一种广泛应用于Web开发领域的编程语言,在多年的发展中经历了多个版本的更新,而最新版的PHP7又在性能和稳定性上有了巨大提升。为了能更好地应用PHP编程语言,这篇文章将介绍PHP7的下载和安装教程,供初学者参考。

记录一次用strace诊断php占用系统资源过高的问题记录一次用strace诊断php占用系统资源过高的问题May 03, 2024 pm 04:31 PM

本地环境:redhat6.7系统。nginx1.12.1,php7.1.0,代码使用yii2框架问题:本地的web站需要用到elasticsearch服务。当php使用本地服务器搭建的elasticsearch时,本地的负载都是正常。当我使用aws的elasticsearchservice服务时,本地服务器出现负载经常过高的情况。查看nginx和php日志,发现没有异常。系统的并发连接数也不高。这时候想到我们老大给我讲的一个strace诊断工具。调试过程:查找一个php的子进程idstrace-

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版