SommaireTelecharger la documentationChapitre suivantChapitre precedent  

  .: News :.: Edito :.: Scripts :.: Forum :.: Erreurs :.: Jobs :. 
 
Sommaire

Créer des variables

Présentation
Longs (Entiers)
Doubles (nombres à virgule flottante)
Chaînes de caractères
Booléens
Tableaux
Objets
Ressources
Les macros de création automatiques de variables globales
Creating Constants

7.11.1 Présentation

Pour créer de nouvelles variables qui pourront être vue "depuis l'extérieur" par le script exécuté, vous devez allouer une nouvelle envelooppe zval, remplir cette enveloppe avec des valeurs cohérentes, puis l'introduire dans la table des symboles interne de Zend. Ce processus élémentaire est commun à toutes les créations de variables.


zval *new_variable; 


/* alloue et initialise une nouvelle enveloppe */

MAKE_STD_ZVAL(new_variable);


/* Modifie le type et le contenu de la variable ici : voyez les sections suivantes */


/* Introduit cette variable sous le nom "new_variable_name" dans la table des symboles */

ZEND_SET_SYMBOL(EG(active_symbol_table), "new_variable_name", new_variable);


/* La variable est maintenant accessible au script, en utilisant $new_variable_name */

La macro MAKE_STD_ZVAL alloue une nouvelle enveloppe zval en utilisant la macro using ALLOC_ZVAL et en l'initialisant avec INIT_ZVAL. Etant donné l'implémentation de Zend au moment de la rédaction, initialisation  signifie mettre le compteur de références à 1 et effacer le flag is_ref, mais ce processus pourrait être étendu ultérieurement. C'est pourquoi c'est une bonne chose d'utiliser MAKE_STD_ZVAL au lieu d'utiliser simplement ALLOC_ZVAL. Si vous voulez optimiser votre code en terme de vitesse (et que vous n'avez pas à optimiser explicitement l'enveloppe zval ici), vous pouvez utiliser ALLOC_ZVAL, mais ce n'est pas recommandé car cette macro n'assure pas l'intégrité des données.

ZEND_SET_SYMBOL se charge d'introduire la nouvelle variable dnas la table des symboles de Zend. Cette macro vérifie si la valeur existe déjà dans la table, et convertit le le nouveau symbole en référence si c'est le cas (avec désallocation autmoatique de l'ancienne enveloppe zval container). Ceci est la meilleure méthode si la vitesse n'est pas un facteur primordial, et que vous souhaitez limiter la consommation de mémoire.

Notez que ZEND_SET_SYMBOL utilise les globales d'exécution de Zend, via la macro EG. En spécifiant EG(active_symbol_table), vous pouvez accéder à la table de symbole courante, qui représente l'environnement d'exécution local. L'environnement d'exécution peut varier, si la fonction a été appelée à l'intérieure d'une autre fonction.

Si vous devez optimiser votre code pour la vitesse, et que vous ne vous souciez pas d'avoir une gestion optimale de la mémorie, vous pouvez omettre de vérifier si une variable existe déjà, et forcer d'insertion dans la table, en utilisant zend_hash_update:


zval *new_variable;


/* alloue et initialise une nouvelle enveloppe */

MAKE_STD_ZVAL(new_variable);


/* Modifie le type et le contenu de la variable ici : voyez les sections suivantes */


/* Introduit cette variable sous le nom "new_variable_name" dans la table des symboles */

zend_hash_update(

    EG(active_symbol_table),

    "new_variable_name",

    strlen("new_variable_name") + 1,

    &new_variable,

    sizeof(zval *),

    NULL

);
Ceci est la méthode traditionnelle dans la plupart des modules modules.

Les variables gémérées par les codes ci-dessus seront toujours accessible au niveau local : elles résident dans le contexte d'exécution local, qui a appelé la fonction courant. Pour créer de nouvelles variables au niveau global, utilisez la même méthode, mais indiquez une autre table des symboles :


zval *new_variable;

     

/* alloue et initialise une nouvelle enveloppe */

MAKE_STD_ZVAL(new_variable);


/* Modifie le type et le contenu de la variable ici : voyez les sections suivantes */


/* Introduit cette variable sous le nom "new_variable_name" dans la table des symboles globale */

ZEND_SET_SYMBOL(&EG(symbol_table), "new_variable_name", new_variable);
La macro ZEND_SET_SYMBOL est appelée avec une référence à la table des symboles principale, avec EG(symbol_table).

Note:  La variable active_symbol_table est un pointeur, mais symbol_table n'en est pas un. C'est pour cela que vous devez utiliser EG(active_symbol_table) et &EG(symbol_table) comme paramètre de ZEND_SET_SYMBOL, qui lui, demande un pointeur.

Similairement, pour obtenir une solution plus efficace, vous pouvez coder en dur la modification de la table des symboles :


zval *new_variable;


/* alloue et initialise une nouvelle enveloppe */

MAKE_STD_ZVAL(new_variable);


/* Modifie le type et le contenu de la variable ici : voyez les sections suivantes */


/* Introduit cette variable sous le nom "new_variable_name" dans la table des symboles globale */

zend_hash_update(

    &EG(symbol_table),

    "new_variable_name",

    strlen("new_variable_name") + 1,

    &new_variable,

    sizeof(zval *),

    NULL

);
<> présente un code source d'exemple, qui crée deux variables : local_variable qui est locale, et global_variable qui est globale.

Note: vous pouvez voir que la variable globale n'est pas accessible à partir de la fonction elle-même. C'est pas ce que la variable n'a pas encore été importée dans le contexte local, avec la commande PHP global $global_variable;.

Créer des variables dans différents contexte

ZEND_FUNCTION(variable_creation)

{

    zval *new_var1, *new_var2;


    MAKE_STD_ZVAL(new_var1);

    MAKE_STD_ZVAL(new_var2);


    ZVAL_LONG(new_var1, 10);

    ZVAL_LONG(new_var2, 5);


    ZEND_SET_SYMBOL(EG(active_symbol_table), "local_variable", new_var1);

    ZEND_SET_SYMBOL(&EG(symbol_table), "global_variable", new_var2);


    RETURN_NULL();


}

Chapitre précédentChapitre suivantAccueil nexen.net