彻底搞懂PHP 变量结构体


Posted in PHP onOctober 11, 2017

PHP5 中的 zval

// 1. zval
typedef struct _zval_struct {
 zvalue_value value;
 zend_uint refcount__gc;
 zend_uchar type;
 zend_uchar is_ref__gc;
} zval;
// 2. zvalue_value
typedef union _zvalue_value {
 long lval;  // 用于 bool 类型、整型和资源类型
 double dval; // 用于浮点类型
 struct {  // 用于字符串
  char *val;
  int len;
 } str;
 HashTable *ht; // 用于数组
 zend_object_value obj; // 用于对象
 zend_ast *ast; // 用于常量表达式(PHP5.6 才有)
} zvalue_value;
// 3. zend_object_value
typedef struct _zend_object_value {
 zend_object_handle handle;
 const zend_object_handlers *handlers;
} zend_object_value;
// 4. zend_object_handle
typedef unsigned int zend_object_handle;

多数文章,在提到PHP5 变量结构体的时候,都提到:sizeof(zval) == 24, sizeof(zvalue_value) == 16,实际上这个论述并不准确,在 CPU 为 64bit 时,这个结果是正确的。

但当 CPU 为32bit 时: sizeof(zval) == 16, sizeof(zvalue_value) == 8,主要因为 CPU 为 64bit 时,指针占用8个字节,而 32bit时,指针为4个字节。

PHP 7 中的 zval

// 1. 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  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 */
  uint32_t  access_flags;   /* class constant access flags */
  uint32_t  property_guard;  /* single property guard */
 } u2;
};
// 2. 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;

PHP 7的看似很多,但其实更简单了,不论 CPU 是32bit 还是 64bit,sizeof(zval) 永远都是等于 16。
主要看 zend_value 中的 ww,是两个 uint32_t,这个永远是 8 个字节,所以 sizeof(zend_value) == 8,因此 sizeof(zval) == 16。

所以 PHP7 新特性提到的节省内存这点上,在 32bit 系统中,PHP5 => PHP7 并无变化。

顺便说下 sizeof,不能当做函数,虽然写法像函数,这个数值会在编译期就确定好,非运行期。类似编译预处理。

总结

以上所述是小编给大家介绍的PHP 变量结构体,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
PHP文本操作类
Nov 25 PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 PHP
php存储过程调用实例代码
Feb 03 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
PHP动态生成指定大小随机图片的方法
Mar 25 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
thinkPHP实现的省市区三级联动功能示例
May 05 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
Aug 02 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
利用php + Laravel如何实现部署自动化详解
Oct 11 #PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
Oct 11 #PHP
laravel migrate初学常见错误的解决方法
Oct 11 #PHP
Laravel学习基础之migrate的使用教程
Oct 11 #PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
Oct 11 #PHP
Laravel中的Blade模板引擎示例详解
Oct 10 #PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 #PHP
You might like
PHP使用glob方法遍历文件夹下所有文件的实例
2018/10/17 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
Firefox outerHTML实现代码
2009/06/04 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
Bootstrap 最常用的JS插件系列总结(图片轮播、标签切换等)
2016/07/14 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【圆形情况】
2018/12/13 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
关于vue路由缓存清除在main.js中的设置
2019/11/06 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
python3.0 字典key排序
2008/12/24 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
2017/10/07 Python
Python3简单实例计算同花的概率代码
2017/12/06 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
求职信模版
2013/11/30 职场文书
业务副厂长岗位职责
2014/01/03 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
大学生思想道德自我评价
2015/03/09 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫