我正在尝试通过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);
}
答案 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。您一次应用了这两个选项,这意味着取消引用发生了两次。