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的...