使用"zval.type=IS_LONG"
方式可以设置一个变量的类型,不过这样做不是很合适,因为不能预测PHP以后的版本会发生什么变化,有可能在以后的版本中type成员变量的名字歌城type_gc或者其他的名字,那么之前写好的扩展就不能适应这些版本了。为了解决这个问题,PHP内核中提供了一个访问和设置变量类型的方法,具体如下:
Z_TYPE(zval) 对应zval结构体的实体
Z_TYPE_P(&zval) 对应zval结构体的指针
Z_TYPE_PP(&&zval) 对应zval结构体的二级指针
可以用如下方式设置变量的类型:
Z_TYPE(zval) = IS_LONG;
用以下方式访问变量的类型:
if (Z_TYPE(zval) == IS_LONG) {
printf("is long \n");
}
这样,就算以后zval结构体的type成员变量改名,我们的扩展也可以继续使用。
与变量的类型一样,变量的值也有相应的访问宏定义,如下表:
类型 | 访问宏 |
---|---|
整数类型 | Z_LVAL(zval) Z_LVAL_P(&zval) Z_LVAL_PP(&&zval) |
浮点类型 | Z_DVAL(zval) Z_DVAL_P(&zval) Z_DVAL_PP(&&zval) |
布尔类型 | Z_BVAL(zval) Z_BVAL_P(&zval) Z_BVAL_PP(&&zval) |
字符串类型 | 取得值: Z_STRVAL(zval) Z_STRVAL_P(&zval) Z_STRVAL_PPP(&&zval) 取得长度: Z_STRLEN(zval) Z_STRLEN_P(&zval) Z_STRLEN_PP(&&zval) |
数组类型 | Z_ARRVAL(zval) Z_ARRVAL_P(&zval) Z_ARRVAL_PP(&&zval) |
资源类型 | Z_RESVAL(zval) Z_RESVAL_P(&zval) Z_RESVAL_PP(&&zval) |
使用上表可以设置一个变量的类型和值。例如,创建一个值为10的整数变量lvar:
zval lvar;
Z_TYPE(lvar) = IS_LONG;
z_LVAL(lvar) = 10;
如果用PHP脚本的话,相当于一下代码:
$lvar = 10;
注意: PHP内核还利用上面的宏包装一些更方便的宏。