【问题标题】:Passing multiple variables by reference in PHP 7.3 extension在 PHP 7.3 扩展中通过引用传递多个变量
【发布时间】:2018-12-20 13:33:00
【问题描述】:

我试图在 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);
}

【问题讨论】:

    标签: php c php-extension php-7.3


    【解决方案1】:

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

    1.) 在对zend_parse_parameters()的调用中将z更改为z/

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

    第二个选项基本上完成了 / 修饰符在调用 zend_parse_parameters() 时所做的事情。如the documentation所示:

    高级类型说明符

    规格      说明

    ...

    /       SEPARATE_ZVAL_IF_NOT_REF 在它后面的参数上

    ...

    所以您应该只使用选项#1 或只使用选项#2。您同时应用了这两个选项,这意味着取消引用发生了两次。

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 1970-01-01
      • 2017-01-20
      • 2011-02-13
      • 2013-06-21
      • 1970-01-01
      • 2019-06-05
      • 2011-08-16
      • 2015-04-01
      相关资源
      最近更新 更多