如何将 zval 转换为向量以进行 php 扩展?

Posted

技术标签:

【中文标题】如何将 zval 转换为向量以进行 php 扩展?【英文标题】:how to convert zval to vector for php extension? 【发布时间】:2012-08-03 18:23:26 【问题描述】:

我正在为我的 c++ 库编写一个 php 扩展,它的定义如下:

bool getPids(map<string,string> pidsMap, vector<string> ids);

现在,我正在为上述函数编写一个 php 包装器。

ZEND_METHOD(myFInfo, get_pids)

    zval *idsArray;

    if (zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "a",
                                &idsArray ) == FAILURE )
    
        RETURN_NULL();
    

现在我想调用 getPids(),但我不知道将 idsArray 作为向量传递给 c++ 函数的正确方法。

在网上搜索后,我发现了一个迭代 zval 数组以读取每个值的示例,我想也许我可以使用它来创建一个向量。

PHP_FUNCTION(hello_array_strings)

    zval *arr, **data;
    HashTable *arr_hash;
    HashPosition pointer;
    int array_count;
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &arr) == FAILURE) 
        RETURN_NULL();
    

arr_hash = Z_ARRVAL_P(arr);
array_count = zend_hash_num_elements(arr_hash);

php_printf("The array passed contains %d elements", array_count);

for(zend_hash_internal_pointer_reset_ex(arr_hash, &pointer); zend_hash_get_current_data_ex(arr_hash, (void**) &data, &pointer) == SUCCESS; 

zend_hash_move_forward_ex(arr_hash, &pointer)) 

            if (Z_TYPE_PP(data) == IS_STRING) 
                PHPWRITE(Z_STRVAL_PP(data), Z_STRLEN_PP(data));
                php_printf("
    ");
            
        
        RETURN_TRUE;
    

但这是最好的方法吗?还是有更好的方法来做到这一点?

谢谢!

【问题讨论】:

【参考方案1】:

要从 PHP 数组中填充 std::vector&lt;std::string&gt;,我会这样做(简短版):

std::vector<std::string> vec;
HashTable *arr_hash = Z_ARRVAL_P(arr);
zval **arr_value;
for(zend_hash_internal_pointer_reset(arr_hash);
    zend_hash_get_current_data(arr_hash, (void **)&arr_value) == SUCCESS;
    zend_hash_move_forward(arr_hash))

    vec.push_back(Z_STRVAL_PP(arr_value));

...其中arr 是您的输入zval *vec 是您的输出向量。

【讨论】:

谢谢。这就是我最终做的。我第一次使用 while 循环,但 for 循环减少了至少 2 行,所以我使用了 for 循环。 @Prod 如果通过单击答案左侧的绿色复选标记解决了您的问题,您应该接受此答案。

以上是关于如何将 zval 转换为向量以进行 php 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

PHP7做了哪些优化

深入理解php内核 编写扩展 II:参数数组和ZVALs

PHP序列化以及反序列化系列[1]--PHP序列化格式的写法

如何从 PHP 扩展返回数组,而不将其复制到内存中?

php扩展分析

php7 zval