Работа с переменным количеством аргументов Учебник PHP

Локальные сети
Архитектура компьютерной сети
Сетевые операционные системы
Технология WI-FI
Угрозы и риски безопасности
беспроводных сетей
Математика
Контрольная по математике
Интегральное исчисление
Элементы теории множеств
Математический анализ
Применение производных
в исследовании функций
Аппарат дифференциальных
уравнений в экономике
Элементы линейного программирования
Динамическое программирование
Дифференциальное исчисление функций
Графические пакеты
Компьютерный монтаж
Учебник Autodesk
Mechanical Desktop
Автоматизация проектирования
Проектирование печатных плат
Вспомогательные программы
Моделирование схем
Редактирование принципиальных схем
Создание проекта в OrCAD
Учебник OrCAD
Редактирование текста
Графический редактор
Corel DRAW
Проектирование многослойных
печатных плат P-CAD
Физика решение задач
Методика решений задач по кинематике
Механика жидкостей и газов
Законы постоянного тока Колебания и волны. Переменный ток
Динамика и законы сохранения в механике
Магнитное поле, электромагнитное взаимодействие
Электростатика
Основы специальной теории относительности
Оптическая физика
Квантовая статистика
Магнитные свойства атомов
Зонная теория твердых тел
Курс лекций по атомной физике
Методика решения задач по Электростатике
История искусства;
Собор Нотр-Дам
Иллюстрированные рукописные книги
Техника темперной и масляной живописи
Иллюстрированный самоучитель
по Macromedia Flash
Учебник по схемотехнике,
Учебник PHP
Работа со строками
Создание расширений
Работа с переменными
Определение количества
аргументов
Доступ к аргументам
Установка на системах Windows
Область видимости переменной
Куки HTTP
Освобождение ресурсов
PHP-скрипты
Установка на системы UNIX
Возвращаемые функциями
значения
Замена переменных в строках
Безопасный режим
Использование функций
FAQ
Система автоматического
построения
 

Если предполагается, что ваша функция принимает переменное количество аргументов, то рассматриваемые здесь примеры кода могут послужит более или менее оптимальным решением. Вы должны создать строку, вызывающую zend_get_parameters_ex(), для каждого возможного количества аргументов, что часто бывает не лучшим решением. Особое место в системах мультимедиа занимает использование аудиоаппаратуры

В таком случае вы можете использовать функцию zend_get_parameters_array_ex(), которая принимает количество запрашиваемых параметров и массив для их хранения:
zval **parameter_array[4]; 
/* получить количество аргументов */ argument_count = ZEND_NUM_ARGS(); /* посмотреть, 
удовлетворяет ли минимальному запросу (2 аргумента) */ /* и максимальному количеству 
(4 аргумента) */ if(argument_count < 2 || argument_count > 5) WRONG_PARAM_COUNT; 
/* количество аргументов корректно, теперь запрашиваем их */ if(zend_get_parameters_array_ex(argument_count, 
parameter_array) != SUCCESS) WRONG_PARAM_COUNT;

Сначала проверяется, находится ли количество аргументов в пределах требуемого диапазона. После этого zend_get_parameters_array_ex() используется для заполнения parameter_array правильными указателями на значения аргументов.Пространство — центральная проблема архитектуры

Очень удачный способ можно найти в коде, работающем с fsockopen() , находящемся в ext/standard/fsock.c, как показано в Листинге 9.7. Не волнуйтесь, если вы ещё не знаете всех функций, использованных в этом исходнике; мы кратко остановимся на них. Белокаменное зодчество Владимиро-суздальской земли Лесные земли Ростово-Суздальского княжества долгое время были глухой окраиной Киевской Руси. Первая столица — Ростов — возникла только в X в. В начале следующего столетия появился Ярославль, основание которого легенда связывает с Владимиром Мономахом.

Рисунок 33-2. Листинг 9.7. PHP-реализация переменного количества аргументов в fsockopen()
pval **args[5]; int *sock=emalloc(sizeof(int)); int *sockp; int 
arg_count=ARG_COUNT(ht); int socketd = -1; unsigned char udp = 0; struct timeval 
timeout = { 60, 0 }; unsigned short portno; unsigned long conv; char *key = NULL; 
FLS_FETCH();  if (arg_count > 5 || arg_count < 2 || zend_get_parameters_array_ex(arg_count,args)==FAILURE) 
{ CLOSE_SOCK(1); WRONG_PARAM_COUNT; } switch(arg_count) { case 5: convert_to_double_ex(args[4]); 
conv = (unsigned long) (Z_DVAL_P(args[4]) * 1000000.0); timeout.tv_sec = conv 
/ 1000000; timeout.tv_usec = conv % 1000000; /* fall-through */ case 4: if (!PZVAL_IS_REF(*args[3])) 
{ php_error(E_WARNING,"error string argument to fsockopen not passed by reference"); 
} pval_copy_constructor(*args[3]); ZVAL_EMPTY_STRING(*args[3]); /* fall-through 
*/ case 3: if (!PZVAL_IS_REF(*args[2])) { php_error(E_WARNING,"error argument 
to fsockopen not passed by reference"); return; } ZVAL_LONG(*args[2], 0); break; 
} convert_to_string_ex(args[0]); convert_to_long_ex(args[1]); portno = (unsigned 
short) Z_LVAL_P(args[1]); key = emalloc(Z_STRLEN_P(args[0]) + 10);

Сопротивление материалов Построение эпюр поперечных сил и изгибающих моментов.

fsockopen() принимает два, три, четыре или пять аргументов. После обязательного объявления переменных эта функция проверяет корректность диапазона аргументов. Затем она использует механизм fall-through в операторе switch() для работы со всеми аргументами. Оператор switch() начинается с максимального количества передаваемых аргументов (пять). После этого она автоматически проходит case четырёх передаваемых аргументов, затем трёх, пропуская обязательное ключевое слово break на всех этапах. После обработки последнего case функция выходит из оператора switch() и выполняет минимальный необходимый процессинг, если функция вызвана с двумя аргументами.

Гарантия безопасной записи других параметров

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

SEPARATE_ZVAL использует emalloc() для выделения нового zval-контейнера, и это означает, что даже если вы не зачистите память самостоятельно, она будет уничтожена автоматически по окончании работы скрипта. Однако выполнение большого количества вызовов этого макроса без освобождения результирующих контейнеров использует большой объём вашей RAM-памяти.

Примечание: поскольку вы без затруднений можете обойти отсутствие доступа для записи с помощью "традиционного" API (с zend_get_parameters() и т.д.), этот API выглядит устаревшим и не обсуждается в этой главе в дальнейшем.
 

Математика решение задач