PHP7中的数据类型

简介: PHP7中的数据类型 PHP中变量名→zval,变量值→zend_value。其变量内存是通过引用计数管理的,在PHP7中引用计数在value结构中。 变量类型: 头文件在PHP源码 /zend/zend_types.h 内部实现: PHP通过zval这个结构体来表示一个变量,而不同类型的变量值则通过zval嵌入的一个人联合体表示,即zend_value。

PHP7中的数据类型

PHP中变量名→zval,变量值→zend_value。其变量内存是通过引用计数管理的,在PHP7中引用计数在value结构中。

变量类型:

头文件在PHP源码 /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

原文地址https://www.cnblogs.com/jiangml/p/10478132.html

相关文章
|
6月前
|
数据采集 存储 监控
注塑机数据采集如何实现与 MES 系统的双向数据闭环?
本文从落地实操出发,系统解析注塑机数据采集的适配范围、400+核心参数、四大应用场景及系统对接方案,直击设备协议繁杂、数据维度不足、系统孤岛等三大难点,提供非侵入式、全覆盖、可闭环的数字化升级路径。
769 6
|
7月前
|
弹性计算 固态存储 JavaScript
阿里云4核8G服务器怎么选?配置、费用、ECS规格及支持人数全解析
阿里云4核8G服务器年付低至955元(u1实例),支持ECS经济型e、计算型c7/c8i、AMD型c8a/c7a等十余种规格,适用日均万级IP访问。配置含Intel至强处理器、8GB内存、1–3M带宽及20–40GB ESSD Entry系统盘,性能稳定,企业级独享资源。
1925 6
|
3月前
|
Java API Maven
Maven多模块项目拆分实战:从50万行单体到独立模块的演进
本文基于一个 50 万行代码的电商单体项目拆分经历,讲解 Maven 多模块项目的完整搭建过程。从模块划分原则、父 POM 设计、循环依赖破解到编译部署优化,给出可直接复用的配置模板和踩坑总结。
|
3月前
|
存储 弹性计算 人工智能
2026年阿里云ECS云服务器配置价格表与性能测评
阿里云ECS云服务器作为弹性计算核心产品,2026年持续优化配置、价格与性能,覆盖个人开发、中小企业应用、企业级高负载等全场景。以下从配置分类、价格体系、性能实测、选型建议四方面展开详解,帮助用户精准匹配需求。
526 0
|
3月前
|
人工智能 网络安全 新制造
孟庆涛:AI 为什么会 “说谎”?GEO 给出了终极答案
生成式AI时代,“幻觉危机”正威胁品牌真实——Gartner指出品牌信息错误率高达37%。辽宁粤穗孟庆涛首创“生成式引擎优化(GEO)”,以权威信源布局、可溯源数据嵌入、交叉验证结构、虚假信息对冲四大技术,让品牌成为AI信赖的“高优先级食材”,筑牢信任护城河。(239字)
227 0
|
7月前
|
JSON API 数据库
超越上下文窗口:CodeAct与RLM,两种代码驱动的LLM扩展方案
本文介绍CodeAct与RLM两大前沿范式:CodeAct让模型用可执行代码调用工具,缓解Context Rot,提升多工具任务成功率;RLM则通过递归分解超长上下文,将推理转化为编程式搜索。二者分别重构“动作空间”与“推理结构”,共同推动LLM从黑箱生成器迈向可编程智能体。
1031 11
超越上下文窗口:CodeAct与RLM,两种代码驱动的LLM扩展方案
|
6月前
|
存储 人工智能 Linux
阿里云+本地零基础保姆级部署OpenClaw|三维记忆架构配置+千问/Coding Plan API+常见问题解答
2026年,AI智能体的核心竞争力已从单一任务执行升级为“持续记忆与自主进化”。OpenClaw(原Clawdbot)作为开源AI自动化框架的代表,突破性地采用“形式-功能-动态”三维记忆架构,通过Token-level(符号记忆)、Parametric(权重记忆)、Latent(向量记忆)三种物理形式,实现事实存储、经验积累与上下文管理的全场景覆盖。搭配阿里云千问大模型或免费Coding Plan API,可让智能体真正“记住”用户偏好、任务经验与知识规则,彻底摆脱传统LLM的“无状态困境”。
779 1
|
12月前
|
安全 Go Docker
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
|
9月前
|
人工智能 监控 数据可视化
2025 主流 BI 工具全景盘点——10款国内外产品赋能企业决策
2025年BI工具迎来AI驱动新阶段,市场规模持续扩张。本文盘点10款主流产品,涵盖瓴羊Quick BI、Power BI、Tableau等,聚焦AI交互、行业适配与生态集成三大趋势,解析各工具核心技术与场景价值,助力企业精准选型,赋能数字化决策升级。Quick BI(阿里云旗下)核心优势:国内唯一连续 6 年入选 Gartner ABI 魔力象限的智能 BI 产品;搭载智能小Q多Agent协同分析功能,中文语义识别准确率达 98%。
|
8月前
|
人工智能 自然语言处理 数据可视化
2026年BI工具推荐,企业如何选择最适合的可视化分析工具?
数据驱动时代,BI工具成企业刚需。2025年全球市场规模将超380亿美元,AI赋能的Quick BI等产品引领变革,支持自然语言交互与智能洞察,助力企业高效决策。