彻底搞懂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生成带有雪花背景的验证码
Sep 28 PHP
php 文件上传代码(限制jpg文件)
Jan 05 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
Aug 21 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
Apr 17 PHP
PHP学习笔记之数组篇
Jun 28 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
Jul 28 PHP
PHP中的类型约束介绍
May 11 PHP
php 变量引用与变量销毁机制详细介绍
Dec 05 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
Jul 19 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
Nov 20 PHP
phpstorm 配置xdebug的示例代码
Mar 31 PHP
php生成静态页面并实现预览功能
Jun 27 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
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
javascript+css 网页每次加载不同样式的实现方法
2009/12/27 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
运算符&&的三个不同层次
2013/04/07 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
JavaScript基本数据类型及值类型和引用类型
2015/08/25 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
jQuery插件FusionCharts实现的3D柱状图效果实例【附demo源码下载】
2017/03/03 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
python 简单的多线程链接实现代码
2016/08/28 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
党员演讲稿
2014/09/04 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
综合管理员岗位职责
2015/02/11 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
西游记读书笔记
2015/06/25 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
2016优秀护士求职自荐信
2016/01/28 职场文书
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
2021/08/02 MySQL
利用Redis实现点赞功能的示例代码
2022/06/28 Redis