Loading... # C 语言是怎样实现存储一个 PHP 的变量? ## 剖析结构体 zend/zend.h 头文件 ```C typedef struct _zval_struct zval; typedef union _zvalue_value{ long lval; double dval; struct{ cha *val; int len; }str; HashTable *ht; // HashTable 实现数组的保存,应用计较广泛,有兴趣可以阅读 C 语言源码 zend_object_value obj; }zvalue_value struct _zval_struct { zvalue_value value; zend_uint refcount; zend_uchar type; zend_uchar is_ref; }; ``` * `zvalue_value value` : 变量的值,PHP 变量的值保存在这里 * `zend_uint refcount` : 变量的引用数,变量引用计算器 * `zend_char type` : 变量的类型 * `zend_uchar is_ref` : 变量是否被引用 > zval 结构体的 value 成员变量是一个 zvalue_value 联合体 > PHP 能支持任何结构也是因为这个联合体 > 当变量是整数,整数的值会保存到 long lval; > 当变量是字符串,字符串的值会保存到 str | PHP 语言层类型 | 保存在 zvalue_value 的成员变量 | | -------------------- | ----------------------------------- | | Long,bool,resource | lval | | double | dval | | string | str(len 长度,val 保存字符串的值) | | array | ht | | object | obj | > type 保存变量的类型,如下 ```c #define IS_NULL //表示 NULL 类型 #define IS_LONG //表示整数类型 #define IS_DOUBLE //表示浮点数类型 #define IS_STRING //表示字符串类型 #define IS_ARRAY //表示数组类型 #define IS_OBJECT //表示对象类型 #define IS_BOOL //表示 bool 类型 #define IS_RESOURCE //表示资源类型 ``` © Allow specification reprint Support Appreciate the author AliPayWeChat Like If you think my article is useful to you, please feel free to appreciate