您好,登录后才能下订单哦!
PHP扩展开发中什么函数返回值,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
API里面提供的宏定义来返回,在一定程度上这么说是不正确的,其实PHP扩展里面所有的函数的返回值都是通过一个名为return_value的变量传
递的,这个变量同时也是函数中的一个参数,在PHP_FUNCTION()原型中定义。该参数总是包含有一个事先申请好空间的zval(关于zval是
PHP扩展开发里面比较复杂的部分,在后面的接收参数一文中再介绍)容器,并给它赋值为NULL,所以即使我们没有声明return_value,也可以
通过直接访问它的成员而给它赋值。
在一个PHP扩展函数中,设置函数返回值,使用以下5种方式都是正确的:
RETURN_LONG(42); RETVAL_LONG(42); return; ZVAL_LONG(return_value, 42); return; Z_TYPE_P(return_value) = IS_LONG; Z_LVAL_P(return_value) = 42; return; return_value->type = IS_LONG; return_value->value.lval = 42; return;
关于ZVAL_LONG、Z_TYPE_P等宏在后面的文章会介绍。其实我们可以看到,RETURN_LONG是对RETVAL_LONG的再次封装,不用我们显式return。正如在第一篇快速入门里面介绍的,Zend API里面针对函数返回值提供了大量的宏定义:
RETURN_xxx系列宏定义:
RETURN_RESOURCE(resource) | 返回一个资源 |
RETURN_BOOL(bool) | 返回一个布尔值 |
RETURN_NULL() | 返回一个空值 |
RETURN_LONG(long) | 返回一个长整数 |
RETURN_DOUBLE(double) | 返回一个双精度浮点数 |
RETURN_STRING(string, duplicate) | 返回一个字符串。duplicate表示这个字符是否使用 strdup()进行复制 |
RETURN_STRINGL(string, length, duplicate) | 返回一个定长的字符串。其余跟 RETURN_STRING 相同。这个宏速度更快而且是二进制安全的 |
RETURN_EMPTY_STRING() | 返回一个空字符串 |
RETURN_FALSE | 返回一个布尔值假 |
RETURN_TRUE | 返回一个布尔值真 |
RETVAL_xxx系列宏定义:
RETVAL_RESOURCE(resource) | 设定返回值为指定的一个资源 |
RETVAL_BOOL(bool) | 设定返回值为指定的一个布尔值 |
RETVAL_NULL | 设定返回值为空值 |
RETVAL_LONG(long) | 设定返回值为指定的一个长整数 |
RETVAL_DOUBLE(double) | 设定返回值为指定的一个双精度浮点数 |
RETVAL_STRING(string, duplicate) | 设定返回值为指定的一个字符串,duplicate含义同 RETURN_STRING |
RETVAL_STRINGL(string, length, duplicate) | 定返回值为指定的一个定长的字符串。其余跟RETVAL_STRING相同。这个宏速度更快而且是二进制安全的 |
RETVAL_EMPTY_STRING | 设定返回值为空字符串 |
RETVAL_FALSE | 设定返回值为布尔值假 |
RETVAL_TRUE | 设定返回值为布尔值真 |
除了使用RETURN_xxx系列宏定义之外,使用其它的方式,我们都需要显式的使用return语句。如果需要返回的是像数组和对象这样的复杂类
型的数据,那就需要先调用array_init()和object_init(),也可以使用相应的hash函数直接操作return_value,由于
这个过程比较复杂,没有相应的宏辅助我们,在后面介绍数组和对象类型时再专门介绍。下面看一个例子,使用上面我们提到的5种方式。
在头文件中加入函数声明:
实现函数:
PHP_FUNCTION(return_value_way1) { RETURN_LONG(42); } PHP_FUNCTION(return_value_way2) { RETVAL_LONG(42); return; } PHP_FUNCTION(return_value_way3) { ZVAL_LONG(return_value, 42); return; } PHP_FUNCTION(return_value_way4) { Z_TYPE_P(return_value) = IS_LONG; Z_LVAL_P(return_value) = 42; return; } PHP_FUNCTION(return_value_way5) { return_value->type = IS_LONG; return_value->value.lval = 42; return; }
注册扩展函数到函数表,这几个函数都不需要参数,用NULL表示:
最后编译扩展,编写简单的测试脚本后运行
关于PHP扩展函数返回值就介绍这么多了。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。