彻底搞懂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代码飞起来的40条小技巧(提升php效率)
Apr 12 PHP
在PHP中使用curl_init函数的说明
Nov 02 PHP
用PHP实现 上一篇、下一篇的代码
Sep 29 PHP
php代码中使用换行及(\n或\r\n和br)的应用
Feb 02 PHP
2014过年倒计时示例
Jan 31 PHP
php-fpm配置详解
Feb 12 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
Oct 20 PHP
php筛选不存在的图片资源
Apr 28 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP进阶学习之垃圾回收机制详解
Jun 18 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
BBS(php & mysql)完整版(五)
2006/10/09 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
2011/08/09 PHP
PHP基础知识回顾
2012/08/16 PHP
php中动态修改ini配置
2014/10/14 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
php操作redis缓存方法分享
2015/06/03 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
bootstrapValidator bootstrap-select验证不可用的解决办法
2017/01/11 Javascript
vue2.0的contextmenu右键弹出菜单的实例代码
2017/07/24 Javascript
p5.js入门教程之小球动画示例代码
2018/03/15 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
js实现开关灯效果
2020/03/30 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
Python循环语句之break与continue的用法
2015/10/14 Python
Python判断值是否在list或set中的性能对比分析
2016/04/16 Python
python基础教程之while循环
2019/08/14 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
什么是Smart Navigation?
2016/07/03 面试题
经济学博士求职自荐信范文
2013/11/23 职场文书
大学毕业感言50字
2014/02/07 职场文书
营销学习心得体会
2014/09/12 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
户籍证明格式
2014/09/15 职场文书
百家讲坛观后感
2015/06/12 职场文书
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python