typedef struct _zval_struct 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;
};
2.變量的類型
zval->type
操作宏
Z_TYPE,Z_TYPE_P(zval *),Z_TYPE_PP(zval **)
IS_NULL
IS_BOOL
IS_LONG
IS_STRING
IS_DOUBLIE
IS_ARRAY
IS_OBJECT
IS_RESOURCE
3.變量的值
int
Z_LVAL(zval)
Z_LVAL_P(zval *)
Z_LVAL_PP(zval **)
bool
Z_BVAL()
float
Z_DVAL
string
Z_STRVAL
Z_STRLEN
array
Z_ARRVAL
resource
Z_RESVAL
object 操作方式不一樣
4.創建變量
(1)內存分配函數
C語言原生函數 PHP內核封裝後的函數
void *malloc(size_t count); void *emalloc(size_t count);
void *pemalloc(size_t count, char persistent);
void *calloc(size_t count); void *ecalloc(size_t count);
void *pecalloc(size_t count, char persistent);
void *realloc(void *ptr, size_t count); void *erealloc(void *ptr, size_t count);
void *perealloc(void *ptr, size_t count, char persistent);
void *strdup(void *ptr); void *estrdup(void *ptr);
void *pestrdup(void *ptr, char persistent);
void free(void *ptr); void efree(void *ptr);
void pefree(void *ptr, char persistent);
void *safe_emalloc(size_t size, size_t count, size_t addtl);
void *safe_pemalloc(size_t size, size_t count, size_t addtl, char persistent);
分配宏MAKE_STD_ZVAL
ALLOC_INIT_ZVAL(pzv) 會將pzv初始爲IS_NULL
(2)設置類型和值
eg:
zval *test
Z_TYPE_P(test) = IS_STRING;
z_STRLEN_P(test) = len;
Z_STRVAL_P(test) = str;
操作的宏
ZVAL_NULL(pzv)
ZVAL_BOOL(pzv)
ZVAL_FALSE(pzv)
ZVAL_TRUE(pzv)
ZVAL_DOUBLE(pzv,val)
ZVAL_LONG(pzv,val)
ZVAL_STRINGL(pzv,str,len,dup)
ZVAL_STRING(pzv,str,len)
ZVAL_RESOURCE(pzv,res)
ZVAL_STRINGL 和 ZVAL_STRING 區別dup指明該字符串是否複製
(5)變量的存儲方式
struct _zend_executor_globals {
...
HashTable symbol_table; /*全局符號表*/
HashTable *active_symbol_table; /*當前活動符號表*/
...
};
eg:
zval *foo; // 創建一個zval結構
MAKE_STD_ZVAL(foo); // 申請空間
ZVAL_STRING(foo, 'test', 1); // 設置值
ZEND_SET_SYMBOL(EG(active_symbol_table), 'foo', foo); //加入到當前的符號表