|
Теперь, после объявления экспортируемых функций, вы должны также ввести их в Zend.
Введение списка функций выполняется через использование массива zend_function_entry. Этот массив последовательно содержит все функции, которые делаются доступными
внешне, с именем функции, как оно должно появляться в PHP, и именем, как оно
определено в C-исходнике. Внутренне zend_function_entry определяется так, как показано в Листинге 9.5.
Рисунок 32-2. Листинг 9.5. Внутреннее объявление zend_function_entry.
typedef struct _zend_function_entry {
char *fname;
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
unsigned char *func_arg_types;
} zend_function_entry; |
Вхождение | Описание | fname |
Обозначает имя функции, как оно видно в PHP (например, fopen,
mysql_connect, или, в нашем примере, first_module). |
handler | Указатель на C-функцию, отвечающую за обработку вызовов данной функции. Например,
см. стандартный макрос INTERNAL_FUNCTION_PARAMETERS, рассмотренный ранее. |
func_arg_types | Даёт вам возможность работать с определёнными параметрами, которые форсируются
для передачи по ссылке. обычно вы должны установить здесь NULL. |
В предыдущем примере объявление выглядит так:
zend_function_entry firstmod_functions[] =
{
ZEND_FE(first_module, NULL)
{NULL, NULL, NULL}
}; |
Видно, что последнее вхождение списка всегда должно быть
{NULL, NULL, NULL}. Этот маркёр должен быть установлен, чтобы Zend знала, когда будет достигнут
конец списка экспортируемых функций.
- Примечание: вы не можете использовать предопределённые
макросы как маркёр конца, так как они будут пытаться обратиться к функции по имени "NULL"!
Макрос ZEND_FE просто расширяется во вхождение структуры в zend_function_entry. Заметьте, что эти макросы вводят специальную схему именования в ваши функции -
ваши C-функции получат префикс zif_, что означает, что ZEND_FE(first_module) будет ссылаться на C-функцию
zif_first_module(). Если вы хотите совместить использование макроса с кодированными вручную
вхождениями (это не очень хорошо), запомните это.
Подсказка: ошибки компиляции, которые ссылаются на функции с именами zif_*(), относятся к
функциям, определённым с помощью ZEND_FE.
В Таблице 9.2 дан список всех макросов, которые вы можете использовать для определения функций.
Рисунок 32-3. Таблица 9.2. Макросы для определения функций
Имя Макроса |
Описание |
---|
ZEND_FE(name, arg_types) |
Определяет вхождение функции с именем name вzend_function_entry.
Требует соответствующей C-функции. arg_types должно быть NULL.
Эта функция использует автоматическую генерацию имени C-функции
путём установления префикса zif_ в имени PHP-функции. Например, ZEND_FE("first_module", NULL)
вводит функцию first_module() в PHP и связывает её с C-функцией zif_first_module().
Используется в сочетании с ZEND_FUNCTION. |
ZEND_NAMED_FE(php_name, name, arg_types) | Определяет функцию, которая будет доступна для PHP по имени
php_name, и связывает её с соответствующим name C-функции. arg_types должно быть NULL.
используйте эту функцию, если вам не нужна автоматическая установка префиксов имён, вводимая ZEND_FE.
Используется в сочетании с ZEND_NAMED_FUNCTION. |
ZEND_FALIAS(name, alias, arg_types) | Определяет псевдоним alias для
name. arg_types должно быть NULL.
Не требует соответствующей C-функции; вместо неё ссылается на цель псевдонима. |
PHP_FE(name, arg_types) | Эквивалент старого PHP API для
ZEND_FE. | PHP_NAMED_FE(runtime_name, name, arg_types) |
Эквивалент старого PHP API для ZEND_NAMED_FE. |
- Примечание: вы не можете использовать ZEND_FE в сочетании с PHP_FUNCTION,
либо PHP_FE в сочетании с ZEND_FUNCTION. Однако абсолютно допустимо смешивать
ZEND_FE и ZEND_FUNCTION сPHP_FE и PHP_FUNCTION при наличии того же набора макросов для каждой объявляемой функции. Но
смешивание не рекомендуется; вместо этого советуем использовать только макросы ZEND_*.
| |