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

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
Bilyooyam
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!