打开Zend/zend.h文件,会发现以下结构体
typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;
struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; };
zvalue_value为PHP中变量具体的值,具体的放到下面说。
_zval_struct即zval结构体, 是PHP中的变量在内核中的表现形式。它有四个成员变量,解释如下:
value | 变量的值,zvalue_value的实例 |
refcount_gc | 变量的引用计数,这里关系到写时复制机制 |
type | 变量的类型 |
is_ref_gc | 变量是否被引用,即为C语言中的& |
对于zvalue_value结构体,它的成员变量比较多,可以看到它是一个union联合体。因此PHP的变量其实是在zval结构体的type变量上标注类型,在value变量上存储变量。zvalue_value结构体不同类型对应的成员变量如下表:
PHP语言层 | zvalue_value的成员变量 |
long,bool,resource | lval |
double | dval |
string | str结构体 |
array | ht |
object | obj |
为了更方便的使用这些变量,zend引擎定义了以下几种变量类型:IS_NULL IS_LONG IS_DOUBLE IS_STRING IS_ARRAY IS_OBJECT IS_BOOL IS_RESOURCE ,每一个宏对应一种数据类型。我们会在后面使用到这些宏。