| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Доступ к аргументамДля доступа к аргументам необходимо иметь для каждого аргумента ясно определённый тип. Предельно динамичная природа PHP позволяет прибегать к некоторым трюкам. Поскольку PHP никогда не делает никакой проверки типа, вызыватель может передавать в функции любой вид данных, хотите вы этого или нет. Если вы ожидаете integer, например, вызыватель может передать массив, и наоборот - PHP этого не заметит. Чтобы работать в этих условиях, вы должны использовать набор API-функций для форсирования конвертации типов каждого передаваемого аргумента (см. Таблицу 9.4). Примечание: Все функции конвертации ожидают в качестве параметра **zval. Рисунок 33-3. Таблица 9.4. Функции конвертации аргументов
Рисунок 33-4. Рисунок 9.5. Конвертация в PHP.Использование этих функций с вашими аргументами гарантирует сохранение типа для всех данных, передаваемых вам. Если предлагаемый тип не соответствует требуемому типу, PHP форсирует содержимое-болванку (пустые строки, массивы или объекты, 0 для числовых значений, FALSE для Boolean), чтобы гарантировать сохранение статуса. Далее идёт выдержка из модуля-сэмпла, обсуждённого ранее, в которой используются функции конвертации:
После получения указателя параметра, значение параметра конвертируется в long (integer), которое формирует также return-значение данной функции. Понимание процесса доступа к содержимому значения требует небольшого обсуждения типа zval, определение которого показано в Листинге 9.8. Рисунок 33-5. Листинг 9.8. Определение PHP/Zend-типа zval.
В действительности pval (определённый в php.h) это лишь псевдоним для zval (определённом в zend.h), который, в свою очередь, ссылается на _zval_struct. Это самая интересная структура. _zval_struct это "мастер"-структура, содержащая структуру значения, тип и справочную информацию. Подструктура zvalue_value это union (объединение), содержащее содержимое переменной. В зависимости от типа переменной, вы должны получать доступ к разным членам этого union. Описание обеих структур см. в Таблицах 9.5, 9.6 и 9.7. Рисунок 33-6. Таблица 9.5. Zend-структура zval
Рисунок 33-7. Таблица 9.6. Zend-структура zvalue_value
Рисунок 33-8. Таблица 9.7. Константы типов Zend-переменных
|
Константа | Описание |
---|---|
IS_NULL | Обозначает NULL (пустое) значение. |
IS_LONG | Значение long (integer). |
IS_DOUBLE | double (floating point). |
IS_STRING | Строка. |
IS_ARRAY | Массив. |
IS_OBJECT | Объект. |
IS_BOOL | Булево значение. |
IS_RESOURCE | Ресурс (обсуждение ресурсов см. далее в соответствующем разделе). |
IS_CONSTANT | Константное (определённое) значение. |
Для доступа к long вы выполняете доступ к zval.value.lval, для доступа к double вы используете zval.value.dval, и так далее. Поскольку все значения хранятся в union, попытка доступа к данным через некорректный член union приведёт к бессмысленному выводу.
Доступ к массивам и объектам немного сложнее и будет рассмотрен позже.
| ||||||
|