彻底搞懂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 相关文章推荐
escape unescape的php下的实现方法
Apr 27 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
PHP中call_user_func_array()函数的用法演示
Feb 05 PHP
php中filter函数验证、过滤用户输入的数据
Jan 13 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
PHP加密解密字符串汇总
Apr 26 PHP
php curl请求信息和返回信息设置代码实例
Apr 27 PHP
非常重要的php正则表达式详解
Jan 04 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
form自动提交实例讲解
Jul 10 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 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自定义函数格式化json数据示例
2016/09/14 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
IE中直接运行显示当前网页中的图片 推荐
2006/08/31 Javascript
一些有关检查数据的JS代码
2006/09/07 Javascript
Javascript 去除数组的重复元素
2010/05/04 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
2012/09/19 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
JS编写函数实现对身份证号码最后一位的验证功能
2016/12/29 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
jQuery实现增删改查
2020/12/22 jQuery
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
Python实现TCP/IP协议下的端口转发及重定向示例
2016/06/14 Python
获取Django项目的全部url方法详解
2017/10/26 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
详解Python中的四种队列
2018/05/21 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
pandas 时间格式转换的实现
2019/07/06 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Python3实现二叉树的最大深度
2019/09/30 Python
Python Selenium参数配置方法解析
2020/01/19 Python
python中adb有什么功能
2020/06/07 Python
DNA测试:Orig3n
2019/03/01 全球购物
会计自荐书
2013/12/02 职场文书
小学生成长感言
2014/01/30 职场文书
婚纱店策划方案
2014/05/22 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
2019年世界儿童日宣传标语
2019/11/22 职场文书