彻底搞懂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 相关文章推荐
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
Jul 22 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
php快速查找数据库中恶意代码的方法
Apr 01 PHP
PHP递归遍历多维数组实现无限分类的方法
May 06 PHP
Yii2框架RESTful API 格式化响应,授权认证和速率限制三部分详解
Nov 10 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
PHP实现的回溯算法示例
Aug 15 PHP
php-fpm超时时间设置request_terminate_timeout资源问题分析
Sep 27 PHP
laravel入门知识点整理
Sep 15 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
Dec 10 PHP
如何理解PHP核心特性命名空间
May 28 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
一段效率很高的for循环语句使用方法
2007/08/13 Javascript
JS匀速运动演示示例代码
2013/11/26 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
AngularJS学习第一篇 AngularJS基础知识
2017/02/13 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
vue实现标签云效果的方法详解
2019/08/28 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
Python格式化压缩后的JS文件的方法
2015/03/05 Python
python+opencv实现的简单人脸识别代码示例
2017/11/14 Python
Numpy中转置transpose、T和swapaxes的实例讲解
2018/04/17 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
python实现内存监控系统
2021/03/07 Python
python中的字符串内部换行方法
2018/07/19 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
BrandAlley英国:法国折扣奢侈品网上零售商
2017/07/03 全球购物
美国知名生活购物网站:Goop
2017/11/03 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
采购部岗位职责
2013/11/24 职场文书
大学生旷课检讨书
2014/01/22 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
志愿者服务感言
2014/02/27 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
党员进社区活动总结
2015/05/07 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
CocosCreator如何实现划过的位置显示纹理
2021/04/14 Javascript