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。