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