Ubuntu下的PHP扩展开发(二):认识变量

打开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 ,每一个宏对应一种数据类型。我们会在后面使用到这些宏。

 

 

原文地址:https://www.cnblogs.com/qifei/p/3967694.html