C 语言是怎样实现存储一个 PHP 的变量?

PHP 使用 C 语言写的,那么 C 语言是怎样存储一个灵活多变的 PHP 变量的呢?可以打开文章了解一下,写的都是基本的数据结构,比较复杂 HashTable 省略了。

C 语言是怎样实现存储一个 PHP 的变量?

剖析结构体 zend/zend.h 头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 保存变量的类型,如下

1
2
3
4
5
6
7
8
#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 //表示资源类型
文章对你有用?给博主一个支持
0%