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