通过PHP 7.3扩展中的引用传递多个变量

时间:2018-12-20 13:33:01

标签: php c php-extension php-7.3

我正在尝试通过php扩展函数中的引用传递多个参数(类型ZVAL)。但是我没有得到改变的价值。我遵循了以下帖子中的建议。 Passing a variable by reference into a PHP7 extension

但是它仅适用于一个论点。下面是我尝试传递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);
}

1 个答案:

答案 0 :(得分:1)

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

1。)在对z的呼叫中将z/更改为zend_parse_parameters()

2。)在重新分配zval之前,将呼叫添加到ZVAL_DEREF(a);SEPARATE_ZVAL_NOREF(a);

如果在对/的调用中提供了zend_parse_parameters()修饰符,则第二个选择基本上可以完成。如the documentation所示:

  

高级类型说明符

     

规范 说明

     

...

     在其后面的参数上

/ SEPARATE_ZVAL_IF_NOT_REF

     

...

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