php扩展编写中的整数参数接收 |
发布: 2014-01-27 13:15 |
在php中没有C/C++语言中的unsigned long long,unsigned int这些无符号整数类型, 在C/C++程序中一般表示为uint64_t,uint32_t等。 如果在php扩展中需要接收这些无符号数据类型,则需要特殊的处理方式。 对于在PHP支持的范围内的整数,可以直接使用"l"参数获取, 但对于赶出php支持范围的整数,一般需要使用"s"参数获取, 之后在C/C++语言中转换成无符号整数。 也就是,通用的情况下,参数定义为mixed(integer/string)类型的。 在扩展中使用"z"接收参数,接收到之后,使用宏Z_TYPE_P判断参数的实际类型, 对于Z_TYPE_P == IS_LONG的时候,直接转换成无符号类型, 因为这情况情况说明PHP正确传递了整数类型的参数。 如果超出了PHP处理的范围,参数会被转换为浮点数,宏Z_TYPE_P应该为IS_DOUBLE类型。 这样就可以根据扩展中判断出来的类型做不同的接收处理。 当使用字符串类型传递这种参数时,Z_TYPE_P == IS_STRING,转换一次就可以。 如果在接收参数的时候指定特定的类型,当传递的参数不是这种类型的时候, 有可能导致PHP进程崩溃。 所以一般比较完善的用法应该是,使用zval类型接收参数,然后使用宏Z_TYPE_P判断类型, 并检测参数的有效性,才能保证PHP扩展不出现崩溃问题。 |
原文: http://qtchina.tk/?q=node/783 |
Powered by zexport
|