首先要知道, 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 个长整形数又可以接收一个字符串的例子: