9.4.1 Créer une fonction PHP
9.4 Étendre PHP 3
9 PHP et le moteur interne Zend
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 . Utilisation de la liste des ressources . Utilisation de la table des ressources persistantes . Ajouter des directives de configuration à l'exécution
|
9.4.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)
| Attention | |
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, 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) { Echec de l'initialiation... }; 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ée 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.
|