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

Гарантирование безопасности записи/Write Safety других параметров.

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

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

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

Поскольку в PHP отсутствует формальное определение функции с поддержкой проверки синтаксиса вызова и поскольку возможно переменное количество аргументов, иногда необходимо определять, с каким количеством аргументов функция была вызвана. Вы можете использовать для этого макрос ZEND_NUM_ARGS. В предыдущих версиях PHP этот макрос запрашивал количество аргументов, с которым функция была вызвана, базируясь на вхождении функции в таблице хэшей, ht, которая передавалась в список INTERNAL_FUNCTION_PARAMETERS. Поскольку сама ht теперь содержит количество аргументов, переданных функции, ZEND_NUM_ARGS укорочен до шаблонного макроса (см. его определение в zend_API.h). Но его использование всё ещё является нормальной практикой, чтобы сохранить совместимость с будущими изменениями в интерфейсе вызова. Искусство Монголии В конце X—XII вв. кочевые монгольские племена заселяли огромную территорию Центральной Азии. В начале XIII в. монгольский правитель Чингисхан (1206— 1227 гг.) завоевал страны Азии и Восточной Европы и основал огромную империю. В 1220 г. Чингисхан основал первую столицу империи Кара-Корум (Город Чёрных Скал) в долине реки Орхон.

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

Следующий код проверяет корректность количества аргументов: Сопротивление материалов Основные требования к деталям и конструкциям и виды расчетов в сопротивлении материалов Механические свойства материалов Прочность — способность не разрушаться под нагрузкой. Жесткость — способность незначительно деформироваться под нагрузкой. Выносливость — способность длительное время выдерживать временные нагрузки. Устойчивость — способность сохранять первоначальную форму упругого равновесия. Вязкость — способность воспринимать ударные нагрузки.
if(ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT;

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

Запрос аргументов

Новый API разбора параметров: В этой главе задокументирован новый Zend API разбора параметров, автор Andrei Zmievski. Он был введён в период между PHP 4.0.6 и 4.1.0.

Разбор параметров это самая распространённая и утомительная операция. Было бы удобно также иметь стандартизованную проверку ошибок и механизм сообщений. Начиная с PHP 4.1.0, имеется способ делать всё это с помощью нового API разбора параметров. Он значительно упрощает процесс получения параметров, но недостаток его в том, что он не может использоваться в функциях, ожидающих переменное количество параметров. но поскольку большинство функций не входят в эту категорию, этот API разбора рекомендуется как новый стандартный способ.

Прототип функции разбора параметров таков:
int zend_parse_parameters(int 
num_args TSRMLS_DC, char *type_spec, ...);

Первый аргумент этой функции это количество реально переданных функции параметров, так что ZEND_NUM_ARGS() может использоваться здесь. Второй параметр всегда должен быть макросом TSRMLS_CC. Третий аргумент это строка, специфицирующая количество и типы аргументов, ожидаемых вашей функцией, аналогично тому, как строка форматирования printf специфицирует количество и формат выводимых значений, с которыми она должна работать. И, наконец, остальные аргументы это указатели на переменные, которые должны принимать значения от параметров.

zend_parse_parameters() выполняет также, где возможно, конвертацию типов, так что вы всегда получаете данные в том формате, который запросили. Любой скалярный тип может быть конвертирован в другой, но конвертация между сложными типами (массивами, объектами и ресурсами) и скалярными типами не допускается.

Если параметр может быть успешно получен и в процессе конвертации не было ошибок, функция возвратит SUCCESS, иначе - FAILURE. Функция выводит информативные сообщения об ошибках, если количество полученных параметров не совпадает с запрашиваемым количеством или если конвертация типов не может  быть выполнена.

Вот некоторые примеры сообщений об ошибках:
Warning! - ini_get_all() requires at most 1 parameter, 2 given 
Warning! - wddx_deserialize() expects parameter 1 to be string, array given

Естественно, каждое сообщение об ошибке сопровождается именем файла и строкой, в которой ошибка возникла.

Вот полный список спецификаторов типов:

  • l - long

  • d - double

  • s - string/строка (с возможным нулевым количеством байтов) и её длина

  • b - boolean

  • r - ресурс, хранимый в zval*

  • a - array/массив, хранимый в zval*

  • o - object/объект (любого класса), хранимый в zval*

  • O - object/объект (класса, специфицированного вхождением класса), хранимый в zval*

  • z - текущий zval*

Следующие символы также имеют значение в строке спецификатора:
  • | - указывает, что оставшиеся параметры являются необязательными. Переменные для хранения, соответствующие этим параметрам, должны быть инициализированы значениями по умолчанию расширением, поскольку они не будут затронуты разбирающей функцией, если параметры не переданы.

  • / - разбирающая функция вызывает SEPARATE_ZVAL_IF_NOT_REF() для следующего за ней параметра, чтобы предоставить копию этого параметра, если только это не ссылка.

  • ! - следующий за ним параметр может быть специфицированного типа или NULL (применяется только к a, o, O, r или z). Если значение NULL передаётся пользователем, хранимый указатель будет установлен в NULL.

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