Sommaire
Présentation des sources
Structure de module
Inclusions des fichiers d'entête
Déclarer les fonctions exportées.
Déclaration du bloc de fonctions Zend
Déclaration du bloc de module Zend
Création de get_module
Implémentation de toutes les fonctions exportées
Conclusion
|
7.9.4 Déclaration du bloc de fonctions Zend
Maintenant que vous avez déclaré les fonctions qui seront exportées,
vous devez aussi les signaler à Zend. Cette étape se fait en utilisant
un tableau de zend_function_entry. Ce tableau contient
consécutivement toutes les fonctions qui doivent être disponibles de manière
externe, avec le nom sous lequel elle doit apparaître en PHP, et son
nom défini en C. En interne, zend_function_entry est défini
comme indiqué dans <>.
Déclaration interne de zend_function_entry. |
typedef struct _zend_function_entry {
char *fname;
void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
unsigned char *func_arg_types;
} zend_function_entry;
|
>
>
Entrée |
Description |
fname |
Définit le nom de la fonction comme il est utilisé dans PHP
(par exemple, fopen, mysql_connect, et
dans notre exemple, first_module).
|
handler |
Un pointeur sur la fonction C responsable de la gestion de l'appel
de cette fonction. Par exemple, voyez la macro standard
INTERNAL_FUNCTION_PARAMETERS présentée un peu plus tôt.
|
func_arg_types |
Cette entrée vous permet de marquer certains paramètres, de manière à
ce qu'ils soient passé par référence. Vous passerez généralement
la valeur NULL.
|
Dans l'exemple ci-dessus, la déclaration ressemble à ceci :
zend_function_entry firstmod_functions[] =
{
ZEND_FE(first_module, NULL)
{NULL, NULL, NULL}
};
Vous pouvez voir que la dernière entrée dans cette liste est
toujours {NULL, NULL, NULL}.
Ce marqueur doit être placé là pour que Zend saches reconnaître la
fin de la liste de fonctions exportées.
Note |
Vous ne pouvez pas utiliser de macros prédéfinie
pour créer le marqueur, car cela vous conduirait à créer une fonction
de nom "NULL".
|
La macro ZEND_FE (surnon de
'Zend function Entry') remplace une structure élément dans
zend_function_entry. Notez que ces macros
introduiront une charte de nommage spéciale dans vos fonctions :
vos fonctions C doivent être préfixées par zif_,
ce qui signifie que ZEND_FE(first_module) fera
référence à une fonction qui s'appelle zif_first_module.
Si vous voulez utiliser les macros en même temps que du code
écrit à la main (très mauvaise idée), gardez bien cela en tête.
Conseil : Les erreurs de compilation qui font référence
aux fonctions nommées zif_* font référence
à des fonctions créées avec ZEND_FE.
<> montre une liste de toutes les
macros que vous pouvez utiliser pour définir des fonctions :
Macros de définitions de fonctions
>
>
Nom de la macro |
Description |
ZEND_FE(name, arg_types) |
Définit une fonction de nom name dans le tableau
zend_function_entry. Requiert une fonction identique
en C. arg_types doit valoir NULL.
Cette fonction utilise une technique de nommage automatique en C
pour générer le nom de la fonction en préfixant ce nom avec
zif_.
Par exemple, ZEND_FE("first_module", NULL) introduit une
nouvelle fonction first_module dans PHP, et la relie
avec la fonction C zif_first_module. Utilisez la en
conjonction avec ZEND_FUNCTION.
|
ZEND_NAMED_FE(php_name, name, arg_types) |
Définit une fonction qui sera disponible en PHP avec le nom
php_name et reliée à la fonction C de nom name.
arg_types doit être mis à NULL. Utilisez
cette fonction si vous ne voulez pas du préfixage automatique introduit
par ZEND_FE. Utilisez la en conjonction avec
ZEND_NAMED_FUNCTION.
|
ZEND_FALIAS(name, alias, arg_types) |
Définit un alias alias pour la fonction name.
arg_types doit être mis à NULL.
Cette macro n'a pas besoin de fonction C correspondante. Elle fait
référence à la fonction alias pour cela.
|
PHP_FE(name, arg_types) |
Ancien équivalent PHP de ZEND_FE.
|
PHP_NAMED_FE(runtime_name, name, arg_types) |
Ancien équivalent PHP de ZEND_NAMED_FE.
|
Note: Vous ne pouvez pas utiliser
ZEND_FE en conjonction avec
PHP_FUNCTION, ou PHP_FE en
conjonction avec ZEND_FUNCTION. Cependant,
il est parfaitement vlaide de mélanger ZEND_FE et
ZEND_FUNCTION avec PHP_FE
et PHP_FUNCTION lorsque vous utilisez le
même jeu de macros pour chaque fonction à déclarer. Mais le
mélange des deux n'est pas recommandé; à la place,
nous vous recommandons d'utiliser les macros ZEND_*
à la place.
|