php扩展调用php函数,PHP扩展开发(4):函数返回值

在第一篇快速入门里面,我们提到函数的返回值要是用Zend

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);

PHP_FUNCTION(return_value_way2);

PHP_FUNCTION(return_value_way3);

PHP_FUNCTION(return_value_way4);

PHP_FUNCTION(return_value_way5);

实现函数:

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表示:

constzend_function_entry fetion_echo_functions[] = {

PHP_FE(say_goodbye, arg_say_goodbye)

PHP_FE(say_hello, NULL)

PHP_FE(return_value_way1, NULL)

PHP_FE(return_value_way2, NULL)

PHP_FE(return_value_way3, NULL)

PHP_FE(return_value_way4, NULL)

PHP_FE(return_value_way5, NULL)

{NULL, NULL, NULL}

};

最后编译扩展,编写简单的测试脚本后运行:

关于PHP扩展函数返回值就介绍这么多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值