彻底搞懂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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
smarty模板局部缓存方法使用示例
Jun 17 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
Jul 12 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
php遍历目录方法小结
Mar 10 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
实例讲解PHP表单处理
Feb 15 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实现二维数组按某列进行排序的方法
2016/11/18 PHP
CI框架常用函数封装实例
2016/11/21 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
非常好的js代码
2006/06/27 Javascript
JavaScript Konami Code 实现代码
2009/07/29 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
Angular Module声明和获取重载实例代码
2016/09/14 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
node基于async/await对mysql进行封装
2019/06/20 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
Paypal支付不完全指北
2020/06/04 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Mac 上切换Python多版本
2017/06/17 Python
Python使用flask框架操作sqlite3的两种方式
2018/01/31 Python
python生成n个元素的全组合方法
2018/11/13 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
青奥会口号
2014/06/12 职场文书
电子商务求职信
2014/06/15 职场文书
爱的承诺书
2015/01/20 职场文书
学生会辞职信
2015/03/02 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
手写实现JS中的new
2021/11/07 Javascript
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers