欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP内核变量访问宏

程序员文章站 2022-08-11 12:29:18
使用"zval.type=IS_LONG" 方式可以设置一个变量的类型,不过这样做不是很合适,因为不能预测PHP以后的版本会发生什么变化,有可能在以后的版本中t...

使用"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内核还利用上面的宏包装一些更方便的宏。