php常量

2012/08/21 00:28
阅读数 82

常量的内部结构
Zend/zend_constants.h

typedef struct _zend_constant {
	    zval value; /* zval结构,PHP内部变量的存储结构 */
	    int flags;  /* 常量的标记如 CONST_PERSISTENT | CONST_CS */
	    char *name; /* 常量名称 */
	    uint name_len; /* 名称长度 */
	    int module_number;  /* 模块号 */
} zend_constant;

php的define函数

Zend/zend_builtin_functions.c

c.value = *val;
zval_copy_ctor(&c.value);
if (val_free) {
	zval_ptr_dtor(&val_free);
}
c.flags    = case_sensitive; /* non persistent */
c.name     = zend_strndup(name, name_len);
c.name_len = name_len+1;
c.module_number = PHP_USER_CONSTANT;
if (zend_register_constant(&c TSRMLS_CC) == SUCCESS) {
	RETURN_TRUE;
} else {
	RETURN_FALSE;
}

php 的defined函数

if (zend_get_constant_ex(name, name_len, &c, NULL, ZEND_FETCH_CLASS_SILENT TSRMLS_CC)) {
	zval_dtor(&c);
	RETURN_TRUE;
} else {
	RETURN_FALSE;
}

zend_get_constant_ex调用zend_get_constant
zend_hash_find(EG(zend_constants), name, name_len+1, (void **) &c)

 

 php注册常量的步骤

php_cgi_startup() -> 
php_module_startup() ->
zend_startup() -> 
zend_register_standard_constants()->
zend_register_constant()

zend_hash_add(EG(zend_constants), name, c->name_len, (void *) c,
	        sizeof(zend_constant), NULL)==FAILURE)

 




展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部