所有的 php 类型在 php 内部都是用一个 zval 结构存储的,下面是 zval 的存储结构 _zval_struct:
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc;
zend_uchar type; /* active type */
zend_uchar is_ref__gc;
};
其中联合体“_zvalue_value”用于表示PHP中所有变量的值,这里之所以使用union,是因为一个zval在一个时刻只能表示一种类型的变量
可以看到,_zval_struct 中除了 zvalue_value 类型的变量值和 zend_uchar 类型的变量类型数据以外,还存储了 refcount__gc 和 is_ref__gc 两个字段is_ref -- is_ref 是一个 bool 类型的值,他用来标识该变量是否属于引用集合(reference set)
refcount -- 引用计数器
查看变量完整信息
通过 xdebug_debug_zval 函数可以查看变量的完整信息:
$a = "new string";
xdebug_debug_zval('a');
?>
打印出了:
a: (refcount=1, is_ref=0)='new string'