0

我试图在 php 扩展函数中通过引用传递多个参数(类型 ZVAL)。但我没有得到改变的价值。我遵循了以下帖子中的建议。通过引用将变量传递到 PHP7 扩展

但它只适用于一个论点。下面是我尝试传递 2 个 ZVAL 的代码

PHP_FUNCTION(sample_byref_compiletime)
{
    zval *a,*b;     
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,
        "z/z/", &a, &b ) == FAILURE)
    {
        php_printf("Error");
        RETURN_NULL();
    }
    ZVAL_DEREF(a);
    SEPARATE_ZVAL_NOREF(a);
    zval_dtor(a);   
    ZVAL_LONG(a, 40);

    ZVAL_DEREF(b);
    SEPARATE_ZVAL_NOREF(b);
    zval_dtor(b);   
    ZVAL_LONG(b, 41);
}
4

1 回答 1

1

我认为您可能误解了您在问题中链接的帖子的答案。虽然,值得称赞的是,这有点令人困惑。答案提出了两种可能的解决方案:

1.)在调用中更改zz/zend_parse_parameters()

或者

2.)在重新分配 zval 之前ZVAL_DEREF(a);和之前添加调用。SEPARATE_ZVAL_NOREF(a);

第二个选项基本上完成了/修饰符在调用zend_parse_parameters(). 如文档所示:

高级类型说明符

规格       说明

...

/       SEPARATE_ZVAL_IF_NOT_REF在它遵循的参数上

...

因此,您应该仅使用选项#1 或仅使用选项#2。您一次应用了这两个选项,这意味着取消引用发生了两次。

于 2019-01-03T23:31:17.907 回答