Передача нескольких переменных по ссылке в расширении PHP 7.3 - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь передать несколько параметров (типа 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 Ответ

0 голосов
/ 04 января 2019

Я думаю, вы, возможно, неправильно поняли ответ на пост, который вы указали в своем вопросе.Хотя, к твоему кредиту, это было немного странно.В ответе представлены два возможных решения:

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.Вы применили оба варианта одновременно, что означает, что разыменование происходит дважды.

...