一 zend_parse_parameters原型 int zend_parse_parameters ( int num_args TSRMLS_DC, char* type_spec, ... ); 第一个参数是传递给函数的参数个数,通常的做法是传给它ZEND_NUM_ARGS()。这是一个表示传递给函数参数总个数的宏。 第二个参数是为了线程安全,
下表列出了可能指定的类型。
类型指定符 |
对应的C类型 |
描述 |
l |
long |
符号整数 |
d |
double |
浮点数 |
s |
char *, int |
二进制字符串,长度 |
b |
zend_bool |
逻辑型(1或0) |
r |
zval * |
资源(文件指针,数据库连接等) |
a |
zval * |
联合数组 |
o |
zval * |
任何类型的对象 |
O |
zval * |
指定类型的对象。需要提供目标对象的类类型 |
z |
zval * |
任何操作的zval |
zval是Zend引擎的值容器[1]。无论这个变量是布尔型,字符串型或者其他任何类型,其信息总会包含在一个zval联合体中。本章中我们不直接存取zval,而是通过一些附加的宏来操作。下面的是或多或少在C中的zval, 以便我们能更好地理解接下来的代码。
[cpp] view plaincopy
扩展API包含丰富的用于从函数中返回值的宏。这些宏有两种主要风格:第一种是RETVAL_type()形式,它设置了返回值但C代码继续执行。这通常使用在把控制交给脚本引擎前还希望做的一些清理工作的时候使用,然后再使用C的返回声明 ”return” 返回到PHP;后一个宏更加普遍,其形式是 RETURN_type(),他设置了返回类型,同时返回控制到PHP。
设置返回值并且结束函数 |
设置返回值 |
宏返回类型和参数 |
RETURN_LONG(l) |
RETVAL_LONG(l) |
整数 |
RETURN_BOOL(b) |
RETVAL_BOOL(b) |
布尔数(1或0) |
RETURN_NULL() |
RETVAL_NULL() |
NULL |
RETURN_DOUBLE(d) |
RETVAL_DOUBLE(d) |
浮点数 |
RETURN_STRING(s, dup) |
RETVAL_STRING(s, dup) |
字符串。如果dup为1,引擎会调用estrdup()重复s,使用拷贝。如果dup为0,就使用s |
RETURN_STRINGL(s, l, dup) |
RETVAL_STRINGL(s, l, dup) |
长度为l的字符串值。与上一个宏一样,但因为s的长度被指定,所以速度更快。 |
ETURN_TRUE |
RETVAL_TRUE |
返回布尔值true。注意到这个宏没有括号。 |
RETURN_FALSE |
RETVAL_FALSE |
返回布尔值false。注意到这个宏没有括号。 |
RETURN_RESOURCE(r) |
RETVAL_RESOURCE(r) |
资源句柄。 |