PHP扩展开发-07-函数调用
来源:互联网 发布:深度卷积网络怎么用 编辑:程序博客网 时间:2024/06/05 21:53
1 函数返回值
终于讲完zval了,前面我们讲到了函数的定义和使用,但是我们没有讲函数的返回值。因为C扩展中,函数的返回值类型为zval的,所以我们把这一节放在了这里进行讲解。
本节任务,我们写一个简单的计算器,完成加减乘除运算,要求:编写函数calculate(num1, num2, opt),我们希望完成num1 opt num2= ?的运算。我们看一下完成上面任务的代码:
PHP_FUNCTION(calculate)
{
int num1;
int num2;
char* opt;
int opt_len;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"lls",
&num1,&num2,&opt,&opt_len)==FAILURE)
{
php_printf("param error. example: calculate(123, 456, '+')\n");
RETURN_NULL();
}
if(1!= opt_len)
{
php_printf("param error. example: calculate(123, 456, '+')\n");
RETURN_NULL();
}
switch (opt[0])
{
case '+':
return_value->type= IS_LONG;
return_value->value.lval= num1 + num2;
break;
case '-':
return_value->type= IS_LONG;
return_value->value.lval= num1 - num2;
break;
case '*':
return_value->type= IS_LONG;
return_value->value.lval= num1 * num2;
break;
case '/':
return_value->type= IS_DOUBLE;
return_value->value.lval= num1 *1.0 / num2;
break;
default:
return_value->type= IS_LONG;
return_value->value.lval= 0;
break;
}
}
看到上面代码,不知道大家有没有疑惑,return_value是怎么来的?
return_value是你宏PHP_FUNCTION宏中定义的,PHP_FUNCTION会声明这个变量,并且将这个变量赋值为NULL,我们来看一下宏定义:
#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
#define INTERNAL_FUNCTION_PARAMETERSint ht, zval *return_value, \
zval **return_value_ptr, zval *this_ptr, intreturn_value_used TSRMLS_DC
从上面的宏定义来看,return_value就是zval的一个指针,php用这个变量来指向函数的返回值。其实我们也有一个宏可以进行简单的返回,宏定义如下,RETVAL_*(v),*表示的就是各种变量类型,v表示变量的值,例如RETVAL_LONG(34),将返回一个long类型的数值,其值为34。
00:14啦,说点题外话,小时候非常喜欢过年,但是长大后发现自己害怕了。不知道你有没有同感?
不说啦,大家有问题给我发邮件niujiaming0819@163.com,或者联系我qq947847775.
现在太晚啦,大家晚安。
- PHP扩展开发-07-函数调用
- 【PHP扩展开发必备】在PHP扩展中通过C语言调用PHP函数与方法
- [php扩展开发] -- 添加函数
- 利用php调用C语言 扩展函数
- 利用php调用C语言 扩展函数
- php 扩展调用 php 标准函数 及 操作全局变量
- php扩展开发,不同扩展使用相同函数名
- 如何在扩展里调用PHP函数呢?
- 如何在扩展里调用PHP函数呢?
- PHP7扩展开发-调用自定义函数,使用可变参
- PHP扩展开发-创建扩展
- PHP扩展开发(4):函数返回值
- PHP扩展开发(4):函数返回值
- PHP扩展开发(4):函数返回值
- [php扩展开发] -- 类构造函数传参
- php扩展函数返回
- 获取php扩展函数
- php扩展函数
- 7K面试题,交通灯管理系统
- oracle expdb导出目录名无效
- 6.00 Introduction to Computer Science and Programming lec5: Objects in Python
- codeforces 258B Little Elephant and Elections 数位DP+DFS
- 随机数算法
- PHP扩展开发-07-函数调用
- INT 2DH中断
- hdu 2089 不要62 数位DP
- POJ 3252 Round Numbers 数位DP
- Windows下Red5安装与使用入门
- 天空之城
- Google Gson 加入到Android中, 打包编译混淆签名之后出现的错误
- hdu 3555 Bomb 数位DP
- Fedora 17 下 Samba 服务快速设置