欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

浅谈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 返回值的详细内容,更多请关注其它相关文章!