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