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。
http://www.bkjia.com/phpjc/477781.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/477781.htmltecharticle1 函数返回值 终于讲完zval了,前面我们讲到了函数的定义和使用,但是我们没有讲函数的返回值。因为c扩展中,函数的返回值类型为zval的...