首页 > Zend API > PHP扩展:如何在Zend Api中对参数进行获取:zend_parse_parameters()和zend_parse_parameters_ex()

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身上)。

下边给几个例子,自己体会下:

zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lsz", &l,&s, &s_len, &param)
//取得一个长整数,一个字符串和它的长度,再取得一个 zval 值

zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|d", &obj, my_ce, &d)
//取得一个由 my_ce 所指定的类的一个对象,另外再取得一个可选的双精度的浮点数

zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O!a", &obj, &arr)
//取得一个对象或空值,再取得一个数组。如果传递进来一个空对象,则 obj 将被设置为NULL

zend_parse_parameters(3, "zbr!", &z, &b, &r)
//仅取得前 3 个参数

此外此函数还有一个带有附加标志的扩展版本,这个标志可以让你控制解析函数的某些动作。
int zend_parse_parameters_ex(int flags, int num_args TSRMLS_DC, char *type_spec, …);
这个标志(flags)目前仅接受 ZEND_PARSE_PARAMS_QUIET 这一个值,它表示这个函数不输出任何错误信息。这对那些可以传入完全不同类型参数的函数非常有用,但这样你也就不得不自己输出错误信息。

下面就是一个如何既可以接收 3 个长整形数又可以接收一个字符串的例子:

long l1, l2, l3;
char *s;
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,ZEND_NUM_ARGS() TSRMLS_CC,“lll”, &l1, &l2, &l3) == SUCCESS) {
	/* manipulate longs */
} else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET,ZEND_NUM_ARGS(), ”s”, &s, &s_len) == SUCCESS) {
	/* manipulate string */
} else {
	php_error(E_WARNING, ”%s() takes either three long values or a string as argument”,get_active_function_name(TSRMLS_C));
	return;
}
  1. 基坑支护 3月 4th, 2014 @ 16:48 | #1

    这个没看懂。。。

评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks