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

剖析结构体 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,resourcelval
doubledval
stringstr(len 长度,val 保存字符串的值)
arrayht
objectobj
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 //表示资源类型
Last modification:February 9th, 2020 at 05:40 pm
小编很用心去写文章的,大家伙们给点支持呗。