zval是PHP变量的底层数据结构,由Zend引擎定义,包含value、type、refcount__gc和is_ref__gc字段;从PHP 7起结构更紧凑,value内嵌于zval,减少内存分配;PHP弱类型特性依赖zval实现类型动态变更;变量赋值时通过写时复制共享zval,引用赋值则标记is_ref__gc为true,修改时触发分离;refcount__gc用于垃圾回收与内存管理;zval机制是理解PHP变量存储、内存优化的核心。

Zval 是 PHP 中用于表示变量的底层数据结构。它全称为 “Zend value”,由 Zend 引擎定义,是 PHP 变量存储和操作的核心。每一个 PHP 变量(如整数、字符串、数组等)在底层都通过一个 zval 结构来表示。
zval 的基本结构
zval 本质上是一个 C 语言结构体,包含几个关键部分:
- value:联合体(union),存储变量的实际数据,比如 long、double、字符串指针等。
- type:标识变量的数据类型,例如 IS_LONG、IS_STRING、IS_ARRAY 等。
- refcount__gc:引用计数,用于实现垃圾回收和写时复制(copy-on-write)机制。
- is_ref__gc:标识该 zval 是否为用户空间中的引用(&$var)。
zval 如何工作
PHP 是弱类型语言,变量类型可以在运行时改变,这依赖于 zval 的设计:
自从百度屏蔽淘宝客网站、淘宝抛弃淘宝客之后,个人站长集体陷入了恐慌之中。此时,什么值得买网的异军突起引起了广大个人站长的极大关注。做一个什么值得买一样的导购网站成了众多个人站长的一致心愿! TP-COUPON 导购系统 即是让个人站长实现此心愿的绝佳选择! 欢迎个人站长选用。V1.1版 更新记录:1.修正请求时查询淘宝店铺错误的bug2.删除一些无用的代码
- 当你创建一个变量
$a = 42;,内核会分配一个 zval,type 设为 IS_LONG,value 存储 42。 - 如果再执行
$a = "hello";,同一个 zval 的 type 会被改为 IS_STRING,value 更新为字符串指针。 - 当变量被赋值给另一个变量时,zval 可能被共享,直到发生修改(写时复制),以节省内存。
引用与共享
多个 PHP 变量可以共享同一个 zval,比如在赋值或传递非引用参数时:
立即学习“PHP免费学习笔记(深入)”;
- 普通赋值:
$b = $a;通常会增加 refcount,但不立即复制 zval。 - 引用赋值:
$b = &$a;会使 is_ref 标志置为 true,后续修改会影响所有引用。 - 当 refcount 大于 1 且发生写操作时,zval 会被分离(separation),生成新的副本。










