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();
}
|
|