彻底搞懂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中文件上传的安全问题
Oct 09 PHP
php 多线程上下文中安全写文件实现代码
Dec 28 PHP
php Xdebug的安装与使用详解
Jun 20 PHP
PHP curl实现抓取302跳转后页面的示例
Jul 04 PHP
PHP语法小结之基础和变量
Nov 22 PHP
Yii模型操作之criteria查找数据库的方法
Jul 15 PHP
利用php生成验证码
Feb 23 PHP
老生常谈PHP面向对象之标识映射
Jun 21 PHP
如何修改yii2.0自带的user表为其它的表
Aug 01 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 PHP
php 的多进程操作实践案例分析
Feb 28 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遍历数组的几种方法
2012/03/22 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
javascript中创建对象的三种常用方法
2010/12/30 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
不到30行JS代码实现Excel表格的方法
2014/11/15 Javascript
JavaScript中的比较操作符>、=、
2014/12/31 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
关于input全选反选恶心的异常情况
2016/07/24 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
理解Python中的类与实例
2015/04/27 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
简单了解python反射机制的一些知识
2019/07/13 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
详解Python中第三方库Faker
2020/09/25 Python
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
车队司机自我鉴定
2014/03/02 职场文书
蓝颜请假条
2014/04/11 职场文书
教师求职信
2014/06/17 职场文书
药店促销活动总结
2014/07/10 职场文书
个人委托函范文
2015/01/29 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL