彻底搞懂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 相关文章推荐
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
php中定时计划任务的实现原理
Jan 08 PHP
php IP转换整形(ip2long)的详解
Jun 06 PHP
PHP对接微信公众平台消息接口开发流程教程
Mar 25 PHP
PHP调用VC编写的COM组件实例
Mar 29 PHP
Thinkphp框架开发移动端接口(1)
Aug 18 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
Oct 08 PHP
Yii2实现增删改查后留在当前页的方法详解
Jan 13 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
Sep 02 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 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和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
js获取当前select 元素值的代码
2010/04/19 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
js利用appendChild对标签进行排序的实现方法
2016/10/16 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
js轮播图的插件化封装详解
2017/07/17 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
微信小程序实现富文本图片宽度自适应的方法
2019/01/20 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
2019/05/10 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
Python实现控制台进度条功能
2016/01/04 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
中国医药集团国药在线:国药网
2017/02/06 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
行政工作个人的自我评价
2014/02/13 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
怎样写辞职信
2015/02/27 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
教育读书笔记
2015/07/02 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js
Python的property属性详细讲解
2022/04/11 Python