В PHP 7 большинство указателей на zval-ы (zval*
) в PHP 5 стали простыми zval-структурами (zval
) - вместо того, чтобы передавать указатели на распределенные в куче (emalloc
) zval-ы, сами zval-ы копируются. Из-за этого, в некотором смысле, return_value
является новым return_value_ptr
, потому что везде на один уровень косвенности меньше.
Итак, чтобы пройти построчно:
Линия 1:
zval* myArray;
В PHP 7 вы не храните указатель на zval, вы помещаете его прямо в стек. Нет внешнего распределения. Поэтому первая строка вашей функции должна быть:
zval myArray;
Строка 2:
array_init(myArray);
array_init
нужен указатель на zval (zval*
), так что это должно быть:
array_init(&myArray);
Строка 4:
zval_ptr_dtor( &return_value );
Опять же, PHP 7 убирает здесь уровень косвенности. Просто сейчас было бы так:
zval_dtor(return_value);
Однако вам не нужна эта строка в PHP 7. zval не нуждается в освобождении памяти (на самом деле вы не можете освободить его), вы можете просто перезаписать его. Однако вам понадобится использовать zval_dtor();
, если zval содержит указатель на строку, массив или какой-либо другой объект, размещенный в куче. Но в этом случае это просто ноль, поэтому вам не нужно его запускать. Продолжая:
Строка 5:
*return_value_ptr = myArray;
Теперь это должно быть:
*return_value = myArray;
Однако, хотя здесь вы можете напрямую перезаписать return_value
, для этого рекомендуется использовать макрос ZVAL_COPY_VALUE
:
ZVAL_COPY_VALUE(return_value, &myArray);
Еще лучше, вы можете использовать RETVAL_ZVAL
, который является ярлыком для установки возвращаемого значения:
RETVAL_ZVAL(&myArray);
Я должен указать, что вам, вероятно, не нужен myArray
zval в этом случае, так как вы можете сохранить массив непосредственно в return_value
и избавить вас от необходимости копировать его позже. Еще одна вещь, которую следует иметь в виду, это то, что вы, вероятно, должны обрабатывать параметры. Если вы ничего не принимаете, zend_parse_parameters_none();
достаточно.
Я предлагаю прочитать руководство по обновлению phpng и руководство по обновлению внутренних компонентов.
person
Andrea
schedule
08.12.2015