Учебник РНР
Назад Глава 32. Исходные Ресурсы. Обсуждение. Вперёд

Объявление блока Zend-функций

Теперь, после объявления экспортируемых функций, вы должны также ввести их в 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_*.

Назад Оглавление Вперёд
Объявление экспортируемых функций Вверх Объявление блока Zend-модуля