Я пытаюсь передать несколько параметров (типа ZVAL) по ссылке в функции расширения php. Но я не получаю измененное значение. Я последовал советам из следующего поста. Передача переменной по ссылке в расширение 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);
}
Я думаю, что вы, возможно, неправильно поняли ответ на пост, который вы указали в своем вопросе. Хотя, к вашему чести, это было немного запутанным. В ответе представлены два возможных решения:
1.) Изменить z
в z/
в призыве к zend_parse_parameters()
или же
2.) Добавить звонки ZVAL_DEREF(a);
а также SEPARATE_ZVAL_NOREF(a);
перед переназначением zval.
Второй вариант по существу делает то, что /
модификатор сделал бы, если предусмотрено в вызове zend_parse_parameters()
, Как документация указывает:
Расширенные Спецификаторы Типа
спекуляция Описание
…
/
SEPARATE_ZVAL_IF_NOT_REF
по параметру следует…
Таким образом, вы должны использовать только вариант № 1 или просто вариант № 2. Вы применили оба варианта одновременно, что означает, что разыменование происходит дважды.
Других решений пока нет …