php7 返回值,7.6.4 函数返回值
### 7.6.4 函數(shù)返回值
調(diào)用內(nèi)部函數(shù)時(shí)其返回值指針作為參數(shù)傳入,這個(gè)參數(shù)為`zval *return_value`,如果函數(shù)有返回值直接設(shè)置此指針即可,需要特別注意的是設(shè)置返回值時(shí)需要增加其引用計(jì)數(shù),舉個(gè)例子來(lái)看:
```c
PHP_FUNCTION(my_func_1)
{
zval *arr;
if(zend_parse_parameters(ZEND_NUM_ARGS(), "a", &arr) == FAILURE){
RETURN_FALSE;
}
//增加引用計(jì)數(shù)
Z_ADDREF_P(arr);
//設(shè)置返回值為數(shù)組:
ZVAL_ARR(return_value, Z_ARR_P(arr));
}
```
此函數(shù)接收一個(gè)數(shù)組,然后直接返回該數(shù)組,相當(dāng)于:
```php
function my_func_1($arr){
return $arr;
}
```
調(diào)用該函數(shù):
```php
$a = array(); //$a -> zend_array(refcount:1)
$b = my_func_1($a); //傳參后:參數(shù)arr -> zend_array(refcount:2)
//然后函數(shù)內(nèi)部賦給了返回值:$b,$a,arr -> zend_array(refcount:3)
//函數(shù)return階段釋放了參數(shù):$b,$a -> zend_array(refcount:2)
var_dump($b);
=============[output]===========
array(0) {
}
```
雖然可以直接設(shè)置return_value,但實(shí)際使用時(shí)并不建議這么做,因?yàn)镻HP提供了很多專門用于設(shè)置返回值的宏,這些宏定義在`zend_API.h`中:
```c
//返回布爾型,b:IS_FALSE、IS_TRUE
#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }
//返回NULL
#define RETURN_NULL() { RETVAL_NULL(); return;}
//返回整形,l類型:zend_long
#define RETURN_LONG(l) { RETVAL_LONG(l); return; }
//返回浮點(diǎn)值,d類型:double
#define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; }
//返回字符串,可返回內(nèi)部字符串,s類型為:zend_string *
#define RETURN_STR(s) { RETVAL_STR(s); return; }
//返回內(nèi)部字符串,這種變量將不會(huì)被回收,s類型為:zend_string *
#define RETURN_INTERNED_STR(s) { RETVAL_INTERNED_STR(s); return; }
//返回普通字符串,非內(nèi)部字符串,s類型為:zend_string *
#define RETURN_NEW_STR(s) { RETVAL_NEW_STR(s); return; }
//拷貝字符串用于返回,這個(gè)會(huì)自己加引用計(jì)數(shù),s類型為:zend_string *
#define RETURN_STR_COPY(s) { RETVAL_STR_COPY(s); return; }
//返回char *類型的字符串,s類型為char *
#define RETURN_STRING(s) { RETVAL_STRING(s); return; }
//返回char *類型的字符串,s類型為char *,l為字符串長(zhǎng)度,類型為size_t
#define RETURN_STRINGL(s, l) { RETVAL_STRINGL(s, l); return; }
//返回空字符串
#define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }
//返回資源,r類型:zend_resource *
#define RETURN_RES(r) { RETVAL_RES(r); return; }
//返回?cái)?shù)組,r類型:zend_array *
#define RETURN_ARR(r) { RETVAL_ARR(r); return; }
//返回對(duì)象,r類型:zend_object *
#define RETURN_OBJ(r) { RETVAL_OBJ(r); return; }
//返回zval
#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }
//返回false
#define RETURN_FALSE { RETVAL_FALSE; return; }
//返回true
#define RETURN_TRUE { RETVAL_TRUE; return; }
總結(jié)
以上是生活随笔為你收集整理的php7 返回值,7.6.4 函数返回值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php为图片添加渐变背景,HTML_CS
- 下一篇: php+jquery实现图片上传预览_和