8.10.4 Chaînes de caractères (strings)
Les chaînes de caractères (appelées aussi des strings) demandent quelques
efforts supplémentaires. Comme mentionné auparavant, toutes les
chaînes de caractères seront associées avec une structure de données
interne à Zend qui a besoin d'être allouée avec les fonctions de gestion
de mémoire de Zend. Le référencement de données statiques,
et celui de données référencées avec des routines standards ne sont pas
autorisées. Pour assigner une chaîne, vous devez utiliser le membre
str
dans le champs
zval.value
.
Le type corresopndant est
IS_STRING
:
zval *new_string; char *string_contents = "Ceci est une nouvelle chaîne";
MAKE_STD_ZVAL(new_string);
new_string->type = IS_STRING; new_string->value.str.len = strlen(string_contents); new_string->value.str.val = estrdup(string_contents);
Notez bien l'utilisation
estrdup
.
Bien sur, vous pouvez aussi utiliser la macro prédéfinie
ZVAL_STRING
:
zval *new_string; char *string_contents = "Ceci est une nouvelle chaîne";
MAKE_STD_ZVAL(new_string); ZVAL_STRING(new_string, string_contents, 1);
ZVAL_STRING
accepte un troisième argument qui indique
si la chaîne fournie doit être dupliquée (en utilisant
estrdup
). En donnant la valeur de
1
à ce paramètre, la chaîne sera dupliquée.
0
fera simplement usage du pointeur fourni pour référer
le contenu. C'est très pratique si vous souhaitez créer une nouvelle
variable qui fait référence à une chaîne qui existe déjà en mémoire Zend.
Si vous voulez tronquer la chaîne à une taille, ou que vous connaissez
déjà la taille de la chaîne, utilisez donc la macro
ZVAL_STRINGL(zval, string, length, duplicate)
, qui
accepte une taille de chaîne explicite. Cette macro est bien plus
rapide que
ZVAL_STRING
tout en supportant les
chaînes binaires.
Pour créer une chaîne vide, donner à votre chaîne la taille de
0
et utilisez
empty_string
comme
contenu :
new_string->type = IS_STRING; new_string->value.str.len = 0; new_string->value.str.val = empty_string;
Bien sur, il y a aussi une macro pour cela :
ZVAL_EMPTY_STRING
).
MAKE_STD_ZVAL(new_string); ZVAL_EMPTY_STRING(new_string);
|