變量

1. 變量在內核中實現的結構體
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); //加入到當前的符號表















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章