Передача нескольких переменных по ссылке в расширении PHP 7.3

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

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

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

Другие вопросы по тегам