彻底搞懂PHP 变量结构体

 更新时间:2017年10月11日 14:13:05   作者:翠竹傲骨  
这篇文章主要介绍了PHP 变量结构体的相关知识,文中提到了PHP5中的 zval和PHP 7 中的 zval,代码简单易懂,需要的朋友可以参考下

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图片水印类的封装

    这篇文章主要为大家详细介绍了PHP图片水印类的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • PHP设计模式之观察者模式入门与应用案例详解

    PHP设计模式之观察者模式入门与应用案例详解

    这篇文章主要介绍了PHP设计模式之观察者模式入门与应用,结合具体案例形式详细分析了PHP观察者模式的相关概念、原理、使用方法及操作注意事项,需要的朋友可以参考下
    2019-12-12
  • PHP中使用FFMPEG获取视频缩略图和视频总时长实例

    PHP中使用FFMPEG获取视频缩略图和视频总时长实例

    这篇文章主要介绍了PHP中使用FFMPEG获取视频缩略图和视频总时长实例,需要的朋友可以参考下
    2014-05-05
  • php 根据URL下载远程图片、压缩包、pdf等文件到本地

    php 根据URL下载远程图片、压缩包、pdf等文件到本地

    这篇文章主要介绍了php 根据URL下载远程图片、压缩包、pdf等文件到本地 ,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • Laravel如何实现自动加载类

    Laravel如何实现自动加载类

    今天小编就为大家整理了一篇Laravel如何实现自动加载类的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • ThinkPHP 6 添加跳转提示扩展 liliuwei/thinkphp-jump的操作方法

    ThinkPHP 6 添加跳转提示扩展 liliuwei/thinkphp-jump的操作

    liliuwei/thinkphp-jump 是 TP5 中经典跳转提示,在 TP6 中已经取消,通过 composer 下载该扩展可以在 TP6 中使用 TP5 的跳转提示操作,这篇文章主要介绍了ThinkPHP 6 添加跳转提示扩展 liliuwei/thinkphp-jump,需要的朋友可以参考下
    2023-08-08
  • PHP连接MYSQL数据库实例代码

    PHP连接MYSQL数据库实例代码

    现在做的项目需要php连接mysql数据库,虽然之前学过,但是现在基本上都给忘了,之后通过查找相关资料找到了解决方法,下面小编把具体方法分享在脚本之家平台供大家学习
    2016-01-01
  • Smarty中调用FCKeditor的方法

    Smarty中调用FCKeditor的方法

    这篇文章主要介绍了Smarty中调用FCKeditor的方法,对比常见的错误方法讲述了Smarty中调用FCKeditor的实现过程,是非常实用的技巧,需要的朋友可以参考下
    2014-10-10
  • Laravel框架源码解析之模型Model原理与用法解析

    Laravel框架源码解析之模型Model原理与用法解析

    这篇文章主要介绍了Laravel框架源码解析之模型Model,结合实例形式分析了Laravel框架模型Model相关原理、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • Laravel定时任务的每秒执行代码

    Laravel定时任务的每秒执行代码

    今天小编就为大家分享一篇Laravel定时任务的每秒执行代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10

最新评论