8.15 Appeler des fonctions utilisateurs
Vous pouvez appeler des fonctions définis par l'utilisateur dans
son script PHP (dites fonctions utilisateurs). C'est très pratique
lorsque vous implémentez des fonctions de callback; par exemple,
dans les cas de fonctions qui traitent les tableaux.
Une fonction utilisateur peut être appelée avec la fonction
call_user_function_ex
. Cette fonction nécessite
une valeur de hash pour la table de fonctions que vous voulez utiliser,
un pointeur vers un objet (si vous voulez en appeler une méthode), le nom
de la fonction, une valeur de retour, un nombre d'arguments, un
tableau d'arguments, et une option qui indique si vous souhaitez faire
une séparation zval.
ZEND_API int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval **retval_ptr_ptr, int param_count, zval **params[], int no_separation);
Notez que vous n'avez qu'à spécifier l'un des deux arguments
function_table
et
object
; l'un
ou l'autre feront l'affaire. Si vous voulez appeler une méthode,
vous devez fournir un objet qui contient cette méthode, auquel
cas,
call_user_function
va automatiquement
utiliser la table de fonctions de l'objet. Sinon, vous n'avez
qu'a spécifier
function_table
. Dans ce cas, passez
la valeur
NULL
au paramètre
object
.
Généralement, la table de fonctions est la table principale
(dite "root"), qui contient la liste de toutes les fonctions définies.
Cette table de fonctions fait partie des variables globales du
compilateur, et peut être utilisée via la macro
CG
.
Pour accéder aux variables globales du compilateur, appelez la
macro
TSRMLS_FETCH
une fois.
Le nom de la fonction est spécifié grâce à une enveloppe
zval
.
Cela peut être un peut suprenant au premier abord, mais c'est une étape
logique car la plus part du temps, vous acceptez des noms de fonctions comme
paramètre, issue du script appelant. Ainsi, comme vous recevez les
noms de fonctions sous forme d'enveloppe zval, il vous suffit de
le passer directement en argument à cette fonction. Le type de
cette enveloppe
zval
doit être
IS_STRING
.
L'argument suivant est constitué d'un pointeur sur la valeur de retour.
Vous n'avez pas à allouer la mémoire pour cette enveloppe : la
fonction le fera pour vous. Cependant, vous devrez détruire cette
enveloppe (avec la fonction
zval_dtor
) après l'exécution!
Le paramètre suivant est le nombre de paramètre (un entier),
puis le tableau contenant les paramètres nécessaires. Le dernier
argument spécifie si la fonction doit effectuer une séparation
zval : il est recommandé d'utiliser la valeur
0
.
Si vous utilisez la valeur de
1
, la fonction
va consommer moins de mémoire, mais échouera si l'un des paramètres
a besoin d'une séparation zval.
Appeler des fonctions définies par l'utilisateur. ilustre l'appel d'une
fonction utilisateur. Le code appelle une fonction dont le nom est
fournie par l'argument, et retourne le résultat de cette fonction
directement. Notez que l'utilisation du constructeur et du destructeur
à la fin : ce n'est pas nécessairement la solution ici (car les valeurs
devraient être séparées, et l'assignation est blindée), mais c'est
une solution techniquement sure.
<?php
dl("call_userland.so");
function test_function() {
print("Nous sommes dans la fonction de test!<br>");
return("bonjour");
}
$return_value = call_userland("test_function");
print("Valeur retournée : \"$return_value\"<br>"); ?>
Sommaire :
|