PHP扩展开发中什么函数返回值
创始人
2024-12-25 21:00:40
0次

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扩展函数返回值就介绍这么多了。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...