IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    PHP内核变量访问宏

    summer发表于 2016-10-31 04:00:23
    love 0

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



沪ICP备19023445号-2号
友情链接