浅谈PHP源码十二:关于return_value 返回值
程序员文章站
2022-03-17 10:58:02
...
这篇文章主要介绍了关于浅谈PHP源码十二:关于return_value 返回值 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
阅读PHP的源码有一段时间了,知道在扩展函数中只要使用PHP_FUNCTION,并且将值赋给return_value就可以返回此函数的值。
然后自己跟踪代码,一直以为有一个return_value这样的全局变量或包含 return_value的全局hashtable存在,然后不停的调试,一直没有发现,
直到今天问了鸟哥后才顿然醒悟,鸟哥在邮件中说:“ return_value是php中所有对php脚本提供函数PHP_FUCTION的一个参数,通过宏展开的。 通过复制给这个参数, ZE会将返回值给前端调用脚本。 ”
其宏定义如下:
#define PHP_FUNCTION ZEND_FUNCTION#define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))#define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
一些内置的函数(比如each)直接使用ZEND_FUNCTION
扩展函数使用PHP_FUNCTION
在一些扩展函数中我们经常看到一些是没有使用return_value,而是使用了一些包含了return_value的宏代替。
常见的宏如下:
// zend_API.h 500行开始 #define ZVAL_FALSE(z) ZVAL_BOOL(z, 0)#define ZVAL_TRUE(z) ZVAL_BOOL(z, 1) #define RETVAL_RESOURCE(l) ZVAL_RESOURCE(return_value, l) #define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b) #define RETVAL_NULL() ZVAL_NULL(return_value) #define RETVAL_LONG(l) ZVAL_LONG(return_value, l) #define RETVAL_DOUBLE(d) ZVAL_DOUBLE(return_value, d) #define RETVAL_STRING(s, duplicate) ZVAL_STRING(return_value, s, duplicate) #define RETVAL_STRINGL(s, l, duplicate) ZVAL_STRINGL(return_value, s, l, duplicate) #define RETVAL_EMPTY_STRING() ZVAL_EMPTY_STRING(return_value) #define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor) #define RETVAL_FALSE ZVAL_BOOL(return_value, 0) #define RETVAL_TRUE ZVAL_BOOL(return_value, 1) #define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; } #define RETURN_BOOL(b) { RETVAL_BOOL(b); return; } #define RETURN_NULL() { RETVAL_NULL(); return;} #define RETURN_LONG(l) { RETVAL_LONG(l); return; } #define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; } #define RETURN_STRING(s, duplicate) { RETVAL_STRING(s, duplicate); return; } #define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; } #define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; } #define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; } #define RETURN_FALSE { RETVAL_FALSE; return; } #define RETURN_TRUE { RETVAL_TRUE; return; }
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
浅谈PHP源码十一:关于 array_key_exists,in_array的介绍
浅谈PHP源码十:关于array_keys,array_values函数
浅谈PHP源码九:关于array_unshift, array_push的介绍
以上就是浅谈PHP源码十二:关于return_value 返回值的详细内容,更多请关注其它相关文章!
下一篇: linux怎么设置ip
推荐阅读
-
浅谈PHP源码三十二:PHP内存池中的emalloc/efree层与堆(heap)层
-
浅谈PHP源码二十九:关于接口的继承
-
浅谈PHP源码三十二:PHP内存池中的emalloc/efree层与堆(heap)层
-
浅谈PHP源码二十八:关于类结构和继承
-
浅谈PHP 源码二十五:关于next,current,key函数
-
浅谈PHP源码十八:关于array_diff_key,array_diff_assoc,array_udiff_assoc 函数
-
浅谈PHP源码十七:关于array_diff,array_udiff,array_diff_ukey,array_diff_uassoc,array_udiff_uassoc的介绍
-
浅谈PHP源码十八:关于array_diff_key,array_diff_assoc,array_udiff_assoc 函数
-
浅谈PHP源码二十九:关于接口的继承
-
浅谈PHP源码十五:关于array_walk函数