千家信息网

php7中zval的示例分析

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章给大家分享的是有关php7中zval的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相
千家信息网最后更新 2025年11月07日php7中zval的示例分析

这篇文章给大家分享的是有关php7中zval的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。

1. zval

1.1 zval的结构(zend_types.h)
typedef struct _zval_struct     zval;struct _zval_struct {    zend_value        value;            /* value */    union {        struct {            ZEND_ENDIAN_LOHI_4(                zend_uchar    type,         /* active type */                zend_uchar    type_flags,                zend_uchar    const_flags,                zend_uchar    reserved)     /* call info for EX(This) */        } v;        uint32_t type_info;    } u1;    union {        uint32_t     var_flags;        uint32_t     next;                 /* hash collision chain */        uint32_t     cache_slot;           /* literal cache slot */        uint32_t     lineno;               /* line number (for ast nodes) */        uint32_t     num_args;             /* arguments number for EX(This) */        uint32_t     fe_pos;               /* foreach position */        uint32_t     fe_iter_idx;          /* foreach iterator index */    } u2;};

zval结构比较简单, 由三个部分组成:

  • zend_value:保存具体变量类型的值或指针

  • u1的核心作用是区分类型

  • u2为辅助值

为了更直观的看下zval的结构及核心字段的取值,我们上张图。

对u1.v.type的说明:

  1. IS_UNDEF:标记未定义,表示数据可以被覆盖或者删除。比如在对数组元素进行unset操作时,PHP 7并不会直接将数据从分配给HashTable的内存中删掉,而是先将该元素所在的Bucket的位置标记为IS_UNDEF,当HashTable中IS_UNDEF元素个数到达一定阈值时,进行rehash操作时再将IS_UNDEF标记的元素覆盖或删除。

  2. IS_TRUE和IS_FALSE:这里将IS_BOOL优化成两个,直接将布尔类型的标记记录在type中。

  3. IS_REFERENCE:是新增的类型,PHP7中使用不同的处理方式来处理"&"

  4. IS_INDIRECT:同样也是新增的类型,由于PHP 7中HashTable的设计跟PHP5中有很大的不同,所以在解决全局符号表访问CV变量表的问题上,引入了IS_INDRECT类型。

  5. IS_PTR:该类型被定义为指针类型,用来解析value.ptr,通常用在函数类型上。比如声明一个函数或者方法。

1.2 zend_value

zval的中zend_value定义如下:

typedef union _zend_value {    zend_long         lval;             /* long value */    double            dval;             /* double value */    zend_refcounted  *counted;    zend_string      *str;    zend_array       *arr;    zend_object      *obj;    zend_resource    *res;    zend_reference   *ref;    zend_ast_ref     *ast;    zval             *zv;    void             *ptr;    zend_class_entry *ce;    zend_function    *func;    struct {        uint32_t w1;        uint32_t w2;    } ww;} zend_value;
1.3 zval内存占用

在一个zval中:

  • zend_value为union,只占8字节。刚好可以存放一个zend_long或是一个double,又或者一个指针。

  • u1为4字节,存储一个v或type_info

  • u2为4字节

所以一个zval占用16字节。相应php5中,一个zval的大小为48字节,的确是巨大的提升。

2. 变量存储

2.1 true, false, null

可根据zval.u1.v.type直接区分,无需zend_value参与

2.2 long,double

直接存储在zend_value的lval或dval中。

2.3 其它类型(string,array,object,resource等)

使用zend_value对应的指针,指向其具体的结构。

比如字串类型的结构为

struct _zend_string {    zend_refcounted_h gc;    zend_ulong        h;                /* hash value */    size_t            len;    char              val[1];};

一个字串变量内存组织如下图所示, zval.value.str指向zend_string结构。

感谢各位的阅读!关于"php7中zval的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

类型 结构 变量 字节 元素 指针 标记 内存 数据 存储 示例 分析 不同 内容 函数 指向 更多 核心 篇文章 处理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 电脑变成网页服务器 移动端缓存数据库数据方案 戴尔2950机架式服务器 bgp服务器托管 英迪网络技术有限公司 魂师对决五一开几个新服务器 软件测试与软件开发工资对比 JADE在哪选择所有数据库 网络安全交友慎重课堂游戏设计 研华服务器u盘启动bios设置 拼多多软件开发工程师的待遇如何 下一代网络技术应用与研究 网络安全与经济关系 广州通讯软件开发批发价 即时通讯软件开发的几大特点 远景动力软件开发 登陆数据库提示超时时间已到 保卫萝卜用什么软件开发 服务器2016g磁盘该怎么分区 东方网景服务器 山东专业服务器租用云主机 北京潮流软件开发服务标准 浪潮服务器公司全称 金铲铲登录服务器已满 重庆潼南生鲜软件开发 网络安全防范措施的具体案例 广东网络安全工程介绍 福建存储服务器机箱是什么 新电脑连接不了服务器 数据库数据源管理系统
0