PHP扩展:如何在Zend Api中对参数进行获取:zend_parse_parameters()和zend_parse_parameters_ex()
首先要知道, ZEND_NUM_ARGS()宏定义可以得到参数的个数。
参数解析函数:
int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, …);
第一个参数num_args表明了我们想要接收的参数个数,一般都使用ZEND_NUM_ARGS() 来表示对传入的参数“有多少要多少”,如果有特殊需求,可以自己直接指定。第二参数应该总是宏 TSRMLS_CC 。第三个参数 type_spec 是一个字符串,用来指定我们所期待接收的各个参数的类型,有点类似于 printf 中指定输出格式的那个格式化字符串。剩下的参数就是我们用来接收PHP参数值的变量的指针。需要说明的一点是:zend_parse_parameters中如果声明了一个字符串类型,那么后面对应的参数将是两个,第一个代表字符串,第二个代表字符串长度。如果声明了一个指定类型的对象实例,那么后面对应的参数也是两个,第一个代表对象,第二个代表对象的类型。
type_spec 的各类型表示如下:
• l – 长整数
• d – 双精度浮点数
• s – 字符串(也可能是空字节)和其长度
• b – 布尔值
• r – 资源, 保存在 zval*
• a – 数组, 保存在 zval*
• o – (任何类的)对象, 保存在 zval*
• O – (由class entry 指定的类的)对象, 保存在 zval*
• z – 实际的 zval*
| – 表明剩下的参数都是可选参数。
/ – 表明参数解析函数将会对剩下的参数以 SEPARATE_ZVAL_IF_NOT_REF()
的方式来提供这个参数的一份拷贝, 除非这些参数是一个引用。
! – 表明剩下的参数允许被设定为 NULL(仅用在a、o、O、r和z身上)。
下边给几个例子,自己体会下:
此外此函数还有一个带有附加标志的扩展版本,这个标志可以让你控制解析函数的某些动作。
int zend_parse_parameters_ex(int flags, int num_args TSRMLS_DC, char *type_spec, …);
这个标志(flags)目前仅接受 ZEND_PARSE_PARAMS_QUIET 这一个值,它表示这个函数不输出任何错误信息。这对那些可以传入完全不同类型参数的函数非常有用,但这样你也就不得不自己输出错误信息。
下面就是一个如何既可以接收 3 个长整形数又可以接收一个字符串的例子: