我们先来看一下zval的定义:
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;
};
typedef struct _zval_structzval;
我们先来看一段代码:
PHP_FUNCTION(hello)
{
zval* t;
ALLOC_INIT_ZVAL(t);
Z_TYPE_P(t)= IS_LONG;
Z_LVAL_P(t)= 1234567890;
zval_ptr_dtor(&t);
}
ALLOC_INIT_ZVAL宏用来给t分配内存,并且将t初始化为一个空变量,Z_TYPE_P用来给zval变量指定变量的类型,Z_LVAL_P用来给变量赋值,zval_ptr_dtor用来清理变量空间。
我们可以使用上面的代码使用变量外,我们还可以使用宏ZVAL_LONG来快速的定义变量和给变量赋值。也就是说上面的代码我们可以使用下面的代码来代替。
PHP_FUNCTION(hello)
{
zval* t;
ZVAL_LONG(t, 1234567890);
}
我们可以使用下面的宏来快速的定义和使用zval变量:
ZVAL_RESOURCE、 ZVAL_BOOL、ZVAL_NULL、ZVAL_LONG、ZVAL_DOUBLE
ZVAL_STRING、ZVAL_STRINGL、ZVAL_EMPTY_STRING、ZVAL_ZVAL
上面的宏很简单,如果大家有什么不明白的地方,大家可以去看看源代码。