php7+zval+string,PHP7扩展开发之常量定义

//增加两个方法

//释放hash

static void say_hash_destroy(HashTable *ht)

zend_string *key;

zval *element;

if (((ht)->u.flags & HASH_FLAG_INITIALIZED)) {

ZEND_HASH_FOREACH_STR_KEY_VAL(ht, key, element) {

if (key) {

free(key);

}

switch (Z_TYPE_P(element)) {

case IS_STRING:

free(Z_PTR_P(element));

break;

case IS_ARRAY:

say_hash_destroy(Z_ARRVAL_P(element));

break;

}

} ZEND_HASH_FOREACH_END();

free(HT_GET_DATA_ADDR(ht));

}

free(ht);

}

//释放数组和字符串

static void say_entry_dtor_persistent(zval *zvalue)

if (Z_TYPE_P(zvalue) == IS_ARRAY) {

say_hash_destroy(Z_ARRVAL_P(zvalue));

} else if (Z_TYPE_P(zvalue) == IS_STRING) {

zend_string_release(Z_STR_P(zvalue));

}

}

//PHP_MINIT_FUNCTION(say)方法的PHP扩展源码: 扩展初始化的调用此方法

PHP_MINIT_FUNCTION(say)

{

zend_constant c;

zend_string *key;

zval value;

ZVAL_NEW_PERSISTENT_ARR(&c.value);

zend_hash_init(Z_ARRVAL(c.value), 0, NULL,

(dtor_func_t)say_entry_dtor_persistent, 1);

add_index_long(&c.value, 0, 2);

key = zend_string_init("site", 4, 1);

ZVAL_STR(&value, zend_string_init("www.bo56.com", 12, 1));

zend_hash_update(Z_ARRVAL(c.value), key, &value);

c.flags = CONST_CS|CONST_PERSISTENT;

c.name = zend_string_init("__ARR__", 7, 1);

c.module_number = module_number;

zend_register_constant(&c);

REGISTER_STRINGL_CONSTANT("__SITE__", "www.bo56.com", 12, CONST_PERSISTENT);

REGISTER_NS_STRINGL_CONSTANT("say", "__SITE__", "bo56.com", 8, CONST_CS|CONST_PERSISTENT);

}

//扩展卸载的时候调用此方法

PHP_MSHUTDOWN_FUNCTION(say)

{

zval *val;

val = zend_get_constant_str("__ARR__", 7);

say_hash_destroy(Z_ARRVAL_P(val));

ZVAL_NULL(val);

return SUCCESS;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值