zval zv;//这与PHP5中创建变量有很大的不同 PHP7中删除了ALLOC_ZVAL、ALLOC_INIT_ZVAL、MAKE_STD_ZVAL、INIT_PZVAL等
ZVAL_LONG(&zv, 0);
在PHP5的Zend Engine的实现中,所有的值都是在堆上分配空间,并且通过引用计数和垃圾收集来管理. PHP5的Zend Engine主要使用指向zval结构的指针来操作值,在很多地方甚至通过zval的二级指针来操作. 而在PHP7的Zend Engine实现中,值是通过zval结构本身来操作(非指针). 新的zval结构直接被存放在VM的栈上,HashTable的桶里,以及属性槽里. 这样大大减少了在堆上分配和释放内存的操作,还避免了对简单值的引用计数和垃圾收集.(转)
宏 | 其它宏的实现方法 |
ZVAL_NULL(pvz); ** (注意这个Z和VAL之间没有下划线!) ** | Z_TYPE_INFO_P(pzv) = IS_NULL;**(IS_NULL型不用赋值,因为这个类型只有一个值就是null,^_^)** |
ZVAL_BOOL(pzv, b); **(将pzv所指的zval设置为IS_TRUE或IS_FALSE类型,值是b)** | Z_TYPE_INFO_P(z) = (b) ? IS_TRUE : IS_FALSE; |
ZVAL_TRUE(pzv); **(将pzv所指的zval设置为IS_TRUE类型 )** | Z_TYPE_INFO_P(z) = IS_TRUE; |
ZVAL_FALSE(pzv); **(将pzv所指的zval设置为IS_FALSE类型)** | Z_TYPE_INFO_P(z) = IS_FALSE |
ZVAL_LONG(pzv, l); **(将pzv所指的zval设置为IS_LONG类型,值是l)** | zval *__z = (z); Z_LVAL_P(__z) = l; Z_TYPE_INFO_P(__z) = IS_LONG; |
ZVAL_DOUBLE(pzv, d); **(将pzv所指的zval设置为IS_DOUBLE类型,值是d)** | Z_TYPE_Pzval *__z = (z); Z_DVAL_P(__z) = d; Z_TYPE_INFO_P(__z) = IS_DOUBLE; |
ZVAL_STRINGL(pzv,str,len); | ZVAL_NEW_STR(pzv, zend_string_init(str, len, 0) |
ZVAL_STRING(pzv, str); | const char *_s = (str); ZVAL_STRINGL(pzv, _s, strlen(_s)); |
ZVAL_RES(pzv, res); | zval *__z = (pzv);Z_RES_P(__z) = (res);Z_TYPE_INFO_P(__z) = IS_RESOURCE_EX; |
如果你想在某一位置截取该字符串或已经知道了这个字符串的长度, 那么可以使用宏 ZVAL_STRINGL(zval, string, length) ,它显式的指定字符串长度, 而不是使用strlen()。这个宏该字符串长度作为参数。但它是二进制安全的,而且速度也比ZVAL_STRING快,因为少了个strlen。