|
Вы можете оказаться в ситуации, когда необходимо иметь доступ для записи
параметра, который запрашивается функцией zend_get_parameters_ex(), но не передаётся по ссылке. В этом случае вы можете использовать макрос
SEPARATE_ZVAL, который выполняет zval-сепарацию в предоставленном контейнере. Вновь
генерируемый zval отсоединяется от внутренних данных и имеет только локальную область видимости,
что означает, что он может быть изменён или уничтожен без глобальных
изменений в контексте скрипта:
zval **parameter;
/* запросить параметр */
zend_get_parameters_ex(1, ¶meter);
/* на этом этапе <parameter> всё ещё соединён */
/* с внутренними буферами данных Zend'а */
/* сделать <parameter> write-safe\безопасным для записи */
SEPARATE_ZVAL(parameter);
/* теперь можно безопасно модифицировать <parameter> */
/* без выполнения глобальных изменений */ |
SEPARATE_ZVAL использует emalloc() для выделения нового zval-контейнера, и это означает, что даже если вы не зачистите память
самостоятельно, она будет уничтожена автоматически по окончании работы
скрипта. Однако выполнение большого количества вызовов этого макроса без
освобождения результирующих контейнеров использует большой объём вашей RAM-памяти.
- Примечание: поскольку вы без затруднений можете обойти
отсутствие доступа для записи с помощью "традиционного" API (с zend_get_parameters() и т.д.), этот API выглядит устаревшим и не обсуждается в этой главе в
дальнейшем.
| |