Учебник РНР
Назад Вперёд

Глава 33. Приём аргументов

Содержание
Определение количества аргументов
Запрос аргументов
Старый способ запроса аргументов (не рекомендуется)
Работа с переменным количеством аргументов/параметров-опций
Доступ к аргументам
Работа с аргументами, передаваемыми по ссылке
Гарантирование безопасности записи/Write Safety других параметров.

Одним из важнейших вопросов для расширений языка является приём и обработка данных, переданных через аргументы. Большинство расширений сконструированы для работы со специфическими данными ввода (или требуют параметров для выполнения своих специфичных акций), и аргументы функций это единственный реальный способ обмена данными между уровнем PHP и уровнем C. Разумеется, имеется также возможность обмена данными с использованием предопределённых глобальных значений (также обсуждаются позднее), но это по всем показаниям должно быть исключено как совершенно недопустимая практика. Детали см. в Главе 1, "Концепции разработки".

PHP не использует формальное определение функции, поскольку синтаксис вызова всегда динамический и никогда не проверяется на наличие ошибок. Проверку корректности синтаксиса выполняет пользовательский код. Например, можно вызвать функцию с использованием только одного аргумента в первый раз и 4 аргументов - в следующий раз, оба вызова синтаксически являются абсолютно корректными.

Определение количества аргументов

Поскольку в PHP отсутствует формальное определение функции с поддержкой проверки синтаксиса вызова и поскольку возможно переменное количество аргументов, иногда необходимо определять, с каким количеством аргументов функция была вызвана. Вы можете использовать для этого макрос ZEND_NUM_ARGS. В предыдущих версиях PHP этот макрос запрашивал количество аргументов, с которым функция была вызвана, базируясь на вхождении функции в таблице хэшей, ht, которая передавалась в список INTERNAL_FUNCTION_PARAMETERS. Поскольку сама ht теперь содержит количество аргументов, переданных функции, ZEND_NUM_ARGS укорочен до шаблонного макроса (см. его определение в zend_API.h). Но его использование всё ещё является нормальной практикой, чтобы сохранить совместимость с будущими изменениями в интерфейсе вызова.

Примечание: старый эквивалент PHP этого макроса - ARG_COUNT.

Следующий код проверяет корректность количества аргументов:
if(ZEND_NUM_ARGS() != 2)
    WRONG_PARAM_COUNT;

Если эта функция не вызывается с двумя аргументами, выполняется выход с сообщением об ошибке. В это коде применена макро-утилита WRONG_PARAM_COUNT, которая может использоваться для генерации стандартного сообщения об ошибке (см. Рисунок 9.4).

Рисунок 33-1. Рисунок 9.4. WRONG_PARAM_COUNT в действии.

Этот макрос печатает сообщение по умолчанию об ошибке, а затем возвращает управление вызывателю. Его определение также можно найти в файле zend_API.h, и выглядит оно так:
ZEND_API void wrong_param_count(void);

#define WRONG_PARAM_COUNT { wrong_param_count(); return; }

Как вы видите, он вызывает внутреннюю функцию wrong_param_count(), которая отвечает за вывод предупреждения. О генерации специализированных сообщений см. далее раздел "Печать информации".


Назад Оглавление Вперёд
Резюме ВверхЗапрос аргументов