_zval_struct
// 16字节zval
struct _zval_struct {
zend_value value; // 8个字节
union u1; // 4字节, u1,u2内存对齐,共8字节
union u2; // 4字节
}
zend_value 存储变量
// 变量赋值时,PHP底层自动解析变量(做类型抓换)存储为合适类型
/* 8字节 zend_value 可以表示PHP中任意一个变量 */
type union_zend_value {
zend_long lval; // 用于存储long int
double dval; // 用于存储 浮点型
zend_refcounted *counted;
zend_string *str; // 用于存储string
zend_array *array *arr; // 用于存储array
zend_object *obj; // 用于存储object 对象类型
zend_resource *res; // 用于存储资源型数据
zend_reference *ref; // 用于存储reference引用类型
zend_ast_ref *ast; // 用于存储抽象语法树
zval *zv; // 指向另一个zval
void *ptr; // 指向一个不确定的变量
zend_class_entry *ce; // 用于存储类
zend_funcion *func // 用于存储函数
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
u1 区分变量类型
/* u1 4字节 */
/* u1 用于表示变量的类型 */
union {
struct {
ZEND_ENDIAN_LOHI_4 (
zend_uchar type,
/* 用于表示变量具体类型 */
/* #define IS_UNDEF 0 未定义 */
/* #define IS_NULL 1 NULL型 */
/* #define IS_FALSE 2 */
/* #defineIS_TRUE 3 */
/* #define IS_LONG 4 整型 */
/* ... */
zend_uchar type_flags,
/* 用于表示变量类型特有的标记*/
/* #define IS_TYPE_CONSTANT (1<<0) 常量类型 */
/* #define IS_TYPE_IMMUTABLE (1<<!) 不可变的, 如共享内存中的数据 */
zend_uchar const_flags,
/* 常量类型标记 */
zend_uchar reserved
/* 保留字段 */
)
} v;
uint32_t type_info; // 计算具体的类型信息
} u1;
u2
/* u2 4字节 */
union {
uint32_t next; /* 解决数组hash冲突 */
unit32_t cache_slot; /* 做运行时缓存 */
unit32_t lineno; /* 标记位置, 如位于PHP某一行 */
unit32_t num_args; /* 函数调用个数 */
uint32_t fe_pos; /* foreach 位置, 每循环一次加1 */
unit32_t fe_iter_idx; /* foreach iterator index ( foreach 游标位置) */
unit32_t access_flags; /* 用于类的类型标记, 如public,private, protected */
unit32_t property_gurad; /* 防止类中的魔术方法频繁引用 */
} u2;