Services webmasters
Partenaires
Jeux concours gratuits
 
Gestion de la mémoire dans une fonction
<<<
Affecter une variable dans la table des symboles Retourne une valeur simple
>>>

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.

<< Affecter une variable dans la table des symboles >>
Gestion de la mémoire dans une fonction Créer une fonction PHP 3 Retourne une valeur simple
Services webmasters
Les manuels
 
CoursPHP.com - Reproduction interdite -