彻底搞懂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中调用ASP.NET的WebService的代码
Apr 22 PHP
php 判断数组是几维数组
Mar 20 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
从wamp到xampp的升级之路
Apr 08 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
php生成curl命令行的方法
Dec 14 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 PHP
基于php伪静态的实现方法解析
Jul 31 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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 版本]
2007/03/20 PHP
set_include_path在win和linux下的区别
2008/01/10 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
js代码实现轮播图
2020/05/04 Javascript
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
利用python获得时间的实例说明
2013/03/25 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
Python 远程开关机的方法
2020/11/18 Python
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
实现向右循环移位
2014/07/31 面试题
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
九年级语文教学反思
2014/02/04 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
马丁路德金演讲稿
2014/05/19 职场文书
幼儿发展评估方案
2014/06/11 职场文书
植树节口号
2014/06/21 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
三月雷锋月活动总结
2014/07/03 职场文书
导游词开场白
2015/01/31 职场文书
辞职书格式样本
2015/02/26 职场文书