C 语言是怎样实现存储一个 PHP5 的变量?
C 语言是怎样实现存储一个 PHP5 的变量?
剖析结构体 zend/zend.h 头文件
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 保存变量的类型,如下
#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 //表示资源类型
今天刚在这论坛发布第一篇文章,更多请关注我的 blog :https://blog.biyongyao.com
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: