Новые книги

«Яндекс» — это, конечно, компания мечты. По всем параметрам. В пятерке поисковиков мировой Сети, в тридцатке самых инновационных компаний мира, и одно из самых желанных мест для работы в России. Бизнес, возникший из головы, интеллекта, знаний, упорного труда, способности к риску и удачи — возникший, несмотря на давление со стороны инвесторов, власти и конкурентов.

Из увлекательного повествования, максимально приближенного к хронике, понятно, что «Яндекс» — это невероятная по силе и напору машина генерации событий, явлений и открытий. Во главе с Аркадием Воложем компания на протяжении уже более полутора десятков лет находится на гребне успеха.

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

Секретов больше нет.
Французский бестселлер, доступно объясняющий, что такое Блокчейн, где применяется эта технология, как она связана с криптовалютой и кто ее создатель. Для ее чтения и понимания не нужно обладать никакими специальными знаниями – все описано очень просто и внятно и, что самое важное, правильно.

Работа с Переменным Количеством Аргументов/Необязательных Параметров



Работа с Переменным Количеством Аргументов/Необязательных Параметров

Учебник РНР
НазадГлава 33. Приём аргументов Вперёд

Работа с переменным количеством аргументов/необязательных параметров

Если предполагается, что ваша функция принимает переменное количество аргументов, то рассматриваемые здесь примеры кода могут послужит более или менее оптимальным решением. Вы должны создать строку, вызывающую 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. Не волнуйтесь, если вы ещё не знаете всех функций, использованных в этом исходнике; мы кратко остановимся на них.

Рисунок 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() и выполняет минимальный необходимый процессинг, если функция вызвана с двумя аргументами.

Этот многоступенчатый процесс позволяет обрабатывать переменное количество аргументов.


Назад Оглавление Вперёд
Старый способ получения аргументов (не рекомендуется) Вверх Доступ к аргументам