彻底搞懂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手册及PHP编程标准
Dec 17 PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
PHP 闭包详解及实例代码
Sep 28 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
PHP使用SOAP调用API操作示例
Dec 25 PHP
详解php中curl返回false的解决办法
Mar 18 PHP
Laravel5.1框架路由分组用法实例分析
Jan 04 PHP
php 中的信号处理操作实例详解
Mar 04 PHP
PHP实现递归的三种方法
Jul 04 PHP
详解PHP设计模式之依赖注入模式
May 25 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几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
Jquery实现的tab效果可以指定默认显示第几页
2013/10/16 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
Jquery实现的角色左右选择特效
2014/05/21 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
Bootstrap Chart组件使用教程
2016/04/28 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
Angular多选、全选、批量选择操作实例代码
2017/03/10 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
javascript中一些奇葩的日期换算方法总结
2018/11/14 Javascript
vue.js的状态管理vuex中store的使用详解
2019/11/08 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
python读取csv文件并把文件放入一个list中的实例讲解
2018/04/27 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
详解python中的闭包
2020/09/07 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
Juicy Couture Beauty官方网站:香水和化妆品
2019/03/12 全球购物
创业计划书的主要内容有哪些
2014/01/29 职场文书
建筑结构施工求职信
2014/07/11 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
三十年同学聚会感言
2015/07/30 职场文书
安全伴我行主题班会
2015/08/13 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python