首先要知道, 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身上)。
下边给几个例子,自己体会下: