11.5.1 Créer une fonction PHP 3
11.5 Développement PHP
11 Appendices
Manuel PHP
. Prototypes de fonctions . Arguments de fonctions . Fonctions à nombre d'arguments variable . Utiliser les arguments d'une fonction . Gestion de la mémoire dans une fonction ->Affecter une variable dans la table des symboles . Retourne une valeur simple . Retourner des valeurs complexes . Utiliser la liste des ressources . Utiliser la table des ressources persistantes. . Ajouter des directives de configuration à l'exécution
|
11.5.1.6 Affecter une variable dans la table des symboles
Un grand nombre de macros sont disponibles pour rendre plus facile l'insertion de
variables dans la table des symboles :
- SET_VAR_STRING(name,value)
- SET_VAR_DOUBLE(name,value)
- SET_VAR_LONG(name,value)
Soyez prudent avec la constante SET_VAR_STRING. La valeur doit être
placée dans une portion de
mémoire créée avec malloc(), sinon le gestionnaire de
mémoire essayera de libérer le pointeur plus tard. Ne passez
aucune mémoire allouée statiquement à SET_VAR_STRING.
Les tables des symboles de
PHP
est une table de hash. A n'importe quel moment,
&symbol_table est un pointeur sur la table principale, et
active_symbol_table pointe sur la table actuellement utilisée.
(ces deux tables peuvent être identiques au démarrage, ou
différent, suivant que vous êtes dans une fonction ou non).
Les exemples suivants utilisent 'active_symbol_table'. Vous devriez la remplacer
par &symbol_table si vous voulez travailler sur la table principale.
De plus, les mêmes fonctions peuvent être appliquées
à des tableaux, comme expliqué ci-dessous.
Vérification de l'existence de $foo dans la table des symboles |
if (hash_exists(active_symbol_table,"foo",sizeof("foo"))) { // existe... } else { // n'existe pas }
|
Rechercher la taille d'une variable dans la table des symboles |
hash_find(active_symbol_table,"foo",sizeof("foo"),&pvalue); check(pvalue.type);
|
En PHP 3.0, les tableaux sont implémentés en utilisant les
mêmes tables de hash que les variables. Cela signifie que les deux
fonctions ci-dessus peuvent être appelées pour vérifier
la présence de variables dans un tableau.
Si vous voulez définir un nouveau tableau dans la table des symboles,
utilisez le code suivant.
D'abord, vous devez vérifier qu'il n'existe pas, avec hash_exists() ou
hash_find().
Puis, initialisez le tableau :
Initialisation d'un tableau |
pval arr; if (array_init(&arr) == FAILURE) { /*Initialiation échouée*/ }; hash_update(active_symbol_table,"foo",sizeof("foo"),&arr,sizeof(pval),NULL);
|
Ce code déclare un nouveau tableau, appelé $foo, dans la table
de symbole. Ce tableau est vide.
Voici comment ajouter deux nouvelles entrées dans ce tableau :
Ajout d'entrées dans un tableau. |
pval entry; entry.type = IS_LONG; entry.value.lval = 5; /* définit $foo["bar"] = 5 */ hash_update(arr.value.ht,"bar",sizeof("bar"),&entry,sizeof(pval),NULL); /* définit $foo[7] = 5 */ hash_index_update(arr.value.ht,7,&entry,sizeof(pval),NULL); /* définit la prochaine place libre dans $foo[], * $foo[8], qui sera 5 (comme en php2) */ hash_next_index_insert(arr.value.ht,&entry,sizeof(pval),NULL);
|
Si vous voulez modifier une valeur que vous avez inséré dans une
table de hash, vous devez d'abord la lire dans la table. Pour éviter
cette recherche, vous pouvez fournir une pval ** à la fonction d'ajout
dans la table de hash, et elle modifiera la valeur à l'adresse pval *,
avec la valeur donnée. Si cette valeur est
NULL
, (comme dans tous les
exemples ci dessus), ce paramètre sera ignoré.
hash_next_index_insert() utiliser plus ou moins la même logique que
"$foo[] = bar;" in PHP 2.0.
Si vous construisez un tableau, pour le retourner, vous pouvez l'initialiser
comme ceci :
if (array_init(return_value) == FAILURE) { échec...; }
puis ajouter les valeurs grâces aux macros:
add_next_index_long(return_value,long_value); add_next_index_double(return_value,double_value); add_next_index_string(return_value,estrdup(string_value));
Bien sûr, si l'ajout n'est pas fait juste après l'initialisation,
vous devrez d'abord rechercher le tableau :
pval *arr; if (hash_find(active_symbol_table,"foo",sizeof("foo"),(void **)&arr)==FAILURE) { introuvable... } else { utilisez arr->value.ht... }
Notez que hash_find reçoit un pointeur sur un pointeur sur pval, et pas un
pointeur sur pval.
Toutes les fonctions d'accès aux hash retourne
TRUE
(SUCCES) ou
FALSE
(FAILURE), excepté hash_exists(), qui retourne un booléen.
|