彻底搞懂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 相关文章推荐
php5.2.0内存管理改进
Jan 22 PHP
人尽可用的Windows技巧小贴士之下篇
Mar 22 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
thinkPHP批量删除的实现方法分析
Nov 09 PHP
php获取今日开始时间和结束时间的方法
Feb 27 PHP
PHP快速推送微信模板消息
Apr 14 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 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
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
深入浅析php中sprintf与printf函数的用法及区别
2016/01/08 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
js实现鼠标移到链接文字弹出一个提示层的方法
2015/05/11 Javascript
asp知识整理笔记3(问答模式)
2015/09/27 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
CSS3 media queries结合jQuery实现响应式导航
2016/09/30 Javascript
BOM之navigator对象和用户代理检测
2017/02/10 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
JavaScript实现点击出现图片并统计点击次数功能示例
2018/07/23 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
vue实现弹幕功能
2019/10/25 Javascript
[04:59]DOTA2-DPC中国联赛 正赛 Ehome vs iG 选手采访
2021/03/11 DOTA
python基础教程之简单入门说明(变量和控制语言使用方法)
2014/03/25 Python
Linux下用Python脚本监控目录变化代码分享
2015/05/21 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
Python 忽略文件名编码的方法
2020/08/01 Python
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
大学生实习自我鉴定
2013/12/11 职场文书
社区端午节活动方案
2014/01/28 职场文书
金融事务专业毕业生求职信
2014/02/23 职场文书
安全负责人任命书
2014/06/06 职场文书
个人债务授权委托书
2014/10/17 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python