- Гарантирование безопасности записи/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, которая
может использоваться для генерации стандартного сообщения об ошибке
header headers_sent
hebrev hebrevc hexdec
highlight_file highlight_string
htmlentities htmlspecialchars
hw_array2objrec hw_changeobject
hw_children hw_childrenobj
hw_close hw_connect
hw_connection_info hw_cp
hw_deleteobject hw_docbyanchor
hw_docbyanchorobj hw_document_attributes
hw_document_bodytag hw_document_content
hw_document_setcontent hw_document_size
hw_dummy hw_edittext
hw_error hw_errormsg
hw_free_document hw_getanchors
hw_getanchorsobj hw_getandlock
hw_getchildcoll hw_getchildcollobj
hw_getchilddoccoll hw_getchilddoccollobj
hw_getobject hw_getobjectbyquery
hw_getobjectbyquerycoll hw_getobjectbyquerycollobj
hw_getobjectbyqueryobj hw_getparents
hw_getparentsobj hw_getrellink
hw_getremote hw_getremotechildren
hw_getsrcbydestobj hw_gettext
hw_getusername hw_identify
hw_incollections hw_info
hw_inscoll hw_insdoc
hw_insertanchors hw_insertdocument
hw_insertobject hw_mapid
hw_modifyobject hw_mv
hw_new_document hw_objrec2array
hw_output_document hw_pconnect
hw_pipedocument hw_root
hw_setlinkroot hw_stat
hw_unlock hw_who
hypot Запрос аргументов
Новый
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.