struct _zval_struct {
    union {
        long lval;
        double dval;
        struct {
            char *val;
            int len;
        } str;
        HashTable *ht;
        zend_object_value obj;
        zend_ast *ast;
    } value;     /* 变量的值 */
    zend_uint refcount__gc; /* 引用次数 */
    zend_uchar type;        /* 变量当前的数据类型 */
    zend_uchar is_ref__gc;  /* 是否是属于引用集合 */
};struct _zval_struct {
    union {
        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;
    }  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     var_flags;
        uint32_t     next;                 /* hash碰撞链 */
        uint32_t     cache_slot;           /* literal cache slot */
        uint32_t     lineno;               /* 行号(AST,对象生成树槽点) */
        uint32_t     num_args;             /* arguments number for EX(This) */
        uint32_t     fe_pos;               /* foreach位置 */
        uint32_t     fe_iter_idx;          /* foreach迭代器索引 */
    } u2;
};<?php
    $a = ['one'];
    $a[] = &$a;
    xdebug_debug_zval('a');
    /**
     (refcount=2, is_ref=1),
        array (size=2)
          0 => (refcount=1, is_ref=0),string 'one' (length=3)
          1 => (refcount=2, is_ref=1),
     */<?php
    $a = ['one']; //--- zval_a(将$a对应的zval,命名为zval_a)
    $a[] = &$a;   //--- step1
    unset($a);    //--- step2对于一个包含环形引用的数组,对数组中包含的每个元素的zval进行减1操作,之后如果发现数组自身的zval的refcount变成了0,那么可以判断这个数组是一个垃圾。
原文:https://www.cnblogs.com/one-villager/p/8865403.html