彻底搞懂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 相关文章推荐
提取HTML标签
Oct 09 PHP
php 方便水印和缩略图的图形类
May 21 PHP
Base64在线编码解码实现代码 演示与下载
Jan 08 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
Feb 14 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
PHP实现的QQ空间g_tk加密算法
Jul 09 PHP
利用PHP将部分内容用星号替换
Apr 21 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
Thinkphp 框架扩展之驱动扩展实例分析
Apr 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
php 邮件发送问题解决
2014/03/22 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
深入理解JavaScript系列(36):设计模式之中介者模式详解
2015/03/04 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Express 配置HTML页面访问的实现
2020/11/01 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
[55:42]VG vs VGJ.T 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
利用Python和OpenCV库将URL转换为OpenCV格式的方法
2015/03/27 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
2017/01/21 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
python变量的存储原理详解
2019/07/10 Python
python能做哪些生活有趣的事情
2020/09/09 Python
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
西班牙最大的婴儿用品网上商店:Bebitus
2019/05/30 全球购物
JAVA中的关键字有什么特点
2014/03/07 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
中专生职业生涯规划书范文
2014/01/10 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
交通事故调解协议书
2014/04/16 职场文书
开学典礼演讲稿
2014/05/23 职场文书
2014年护理工作总结范文
2014/11/14 职场文书
青岛市的收音机研制与生产
2022/04/07 无线电