整理的一篇zend中的数组操作

这篇博客详细介绍了在Zend框架中如何操作数组,包括数组的内存分配、初始化以及添加不同类型的元素方法,如add_assoc系列和add_index系列函数,帮助读者深入理解PHP内核中的数组实现。
摘要由CSDN通过智能技术生成
数组的值存储在zvalue_value.ht字段中,ht是一个HashTable的数据
在Zend/zend_vm_execute.h文件中
static int ZEND_FASTCALL  ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
        zend_op *opline = EX(opline);


        array_init(&EX_T(opline->result.u.var).tmp_var); //分配数组内存空间,初始化
        if (IS_CV == IS_UNUSED) {
                ZEND_VM_NEXT_OPCODE();
#if 0 || IS_CV != IS_UNUSED
        } else {
                return ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
#endif        }
}






初始化数组的函数是 array_init


ZEND_API int _array_init(zval *arg, uint size ZEND_FILE_LINE_DC) /* {{{ */
{
        ALLOC_HASHTABLE_REL(Z_ARRVAL_P(arg)); //分配内存


        _zend_hash_init(Z_ARRVAL_P(arg), size, NULL, ZVAL_PTR_DTOR, 0 ZEND_FILE_LINE_RELAY_CC);
        Z_TYPE_P(arg) = IS_ARRAY; //类型为数组
        return SUCCESS;
}
看到没有,Hash表初始化函数_zend_hash_init




在PHP扩展中我们可以这么写:
PHP_FUNCTION(test)
{
        zval *value;
        MAKE_STD_ZVAL(value);
        array_init(value);
        ZEND_SET_SYMBOL(EG(active_symbol_table),"star",value);








添加一个元素的关键代码












add_assoc_long(zval *array, char *key, long n);    添加一个长整型元素。




add_assoc_unset(zval *array, char *key);             添加一个 unset 元素。




add_assoc_bool(zval *array, char *key, int b);       添加一个布尔值。




add_assoc_resource(zval *array, char *key, int r); 添加一个资源。




add_assoc_double(zval *array, char *key, double d); 添加一个浮点值。




add_assoc_string(zval *array, char *key, char *str, int duplicate); 添加一个字符串。duplicate 用于表明这个字符串是否要被复制到 Zend 的内部内存。




add_assoc_stringl(zval *array, char *key, char *str, uint length, int duplicate); 添加一个指定长度的字符串。




add_assoc_zval(zval *array, char *key, zval *value); 添加一个 zval 结构。 




add_index_long(zval *array, uint idx, long n); 添加一个长整型元素。


add_index_unset(zval *array, uint idx); 添加一个 unset 元素。




add_index_bool(zval *array, uint idx, int b); 添加一个布尔值。


add_index_resource(zval *array, uint idx, int r); 添加一个资源。




add_index_double(zval *array, uint idx, double d); 添加一个浮点值。


add_index_string(zval *array, uint idx, char *str, int duplicate); 
添加一个字符串。duplicate 用于表明这个字符串是否要被复制到 Zend 的内部内存。




add_index_stringl(zval *array, uint idx, char *str, uint length, int duplicate); 添加一个指定长度的字符串。




add_index_zval(zval *array, uint idx, zval *value); 添加一个 zval 结构。 




add_next_index_long(zval *array, long n); 添加一个长整型元素。




add_next_index_unset(zval *array); 添加一个 unset 元素。




add_next_index_bool(zval *array, int b); 添加一个布尔值。




add_next_index_resource(zval *array, int r); 添加一个资源。




add_next_index_double(zval *array, double d); 添加一个浮点值。




add_next_index_string(zval *array, char *str, int duplicate); 添加一个字符串。duplicate 用于表明这个字符串是否要被复制到 Zend 的内部内存。




add_next_index_stringl(zval *array, char *str, uint length, int duplicate); 添加一个指定长度的字符串。




add_next_index_zval(zval *array, zval *value); 添加一个 zval 结构。 添加另外一个数组、对象或流等数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值