PHP在内核中是通过zval这个结构体存储变量的:
struct _aval_struct {
zvalue_value value; // 变量的值
zend_unit refcount__gc; // 引用计数
zend_uchar type; // 变量当前的数据类型
zend_uchar is_ref__gc; // 是否引用状态
};
typedef struct _zval_struct zval;
// 在Zend/zend_types.h里定义的:
typedef unsigned int zend_uint;
typedef unsigned char zend_uchar;
// zvalue_value的定义:
type union _zvalue_value {
long lval;
double dval;
struct {
char *val;
int len; // 字符长度
} str;
HashTable *ht;
zend_object_value obj;
} zvalue_value;
其中zvalue_value中ht是HashTable类型, HashTable在PHP中至关重要,它既具有双向链表的优点,同时具有能与数组匹敌的操作性能,这个数据结构几乎是PHP内核实现的基础.
所有的用户端定义的变量保存在一个符号表里,而这个符号表其实就是一个HashTable,它的每一个元素都是一个zval*类型的变量. 不仅如此,保存用户定义的函数,类,资源等的容器都是以HashTable的形式在内核中实现的.
两篇很不错的文章:
哈希表:
http://www.php-internals.com/book/?p=chapt03/03-01-01-hashtable
PHP的哈希表实现:
http://www.php-internals.com/book/?p=chapt03/03-01-02-hashtable-in-php