Manuel PHP
Précédent | Chapitre 34. Creating Variables | Suivant

# Strings

Strings need slightly more effort. As mentioned earlier, all strings that will be associated with Zend's internal data structures need to be allocated using Zend's own memory-management functions. Referencing of static strings or strings allocated with standard routines is not allowed. To assign strings, you have to access the structure `str` in the `zval.value` container. The corresponding type is `IS_STRING`:

    zval *new_string;
    char *string_contents = "This is a new string variable";

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

Note the usage of Zend's estrdup() here. Of course, you can also use the predefined macro `ZVAL_STRING`:

    zval *new_string;
    char *string_contents = "This is a new string variable";

    MAKE_STD_ZVAL(new_string);
    ZVAL_STRING(new_string, string_contents, 1);

`ZVAL_STRING` accepts a third parameter that indicates whether the supplied string contents should be duplicated (using estrdup()). Setting this parameter to `1` causes the string to be duplicated; `0` simply uses the supplied pointer for the variable contents. This is most useful if you want to create a new variable referring to a string that's already allocated in Zend internal memory.

If you want to truncate the string at a certain position or you already know its length, you can use `ZVAL_STRINGL(zval, string, length, duplicate)`, which accepts an explicit string length to be set for the new string. This macro is faster than `ZVAL_STRING` and also binary-safe.

To create empty strings, set the string length to `0` and use `empty_string` as contents:

    new_string->type = IS_STRING;
    new_string->value.str.len = 0;
    new_string->value.str.val = empty_string;

Of course, there's a macro for this as well (`ZVAL_EMPTY_STRING`):

    MAKE_STD_ZVAL(new_string);
    ZVAL_EMPTY_STRING(new_string);

Précédent | Sommaire | Suivant
Doubles (Floats) | Niveau supérieur | Booleans