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