Skip to content

Latest commit

 

History

History
66 lines (56 loc) · 2.59 KB

2.3.md

File metadata and controls

66 lines (56 loc) · 2.59 KB

2.3 创建PHP变量

  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的区别

如果你想在某一位置截取该字符串或已经知道了这个字符串的长度, 那么可以使用宏 ZVAL_STRINGL(zval, string, length) ,它显式的指定字符串长度, 而不是使用strlen()。这个宏该字符串长度作为参数。但它是二进制安全的,而且速度也比ZVAL_STRING快,因为少了个strlen。

links