• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    彻底搞懂PHP 变量结构体

    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 变量结构体,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    您可能感兴趣的文章:
    • C语言结构体数组同时赋值的另类用法
    • 解析C语言结构体及位段
    • 深度剖析C语言结构体
    • C语言中结构体变量私有化详解
    • C语言使用结构体实现简单通讯录
    • C语言利用结构体数组实现学生成绩管理系统
    • C语言结构体定义的方法汇总
    • C++结构体struct和类class区别详解
    • C#中结构体定义并转换字节数组详解
    • C++中对C语言结构体用法的扩充
    上一篇:利用php + Laravel如何实现部署自动化详解
    下一篇:深入理解PHP中mt_rand()随机数的安全
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    彻底搞懂PHP 变量结构体 彻底,搞懂,PHP,变量,结构,