PHP源码阅读笔记十二:return_value 返回值

PHP源码阅读笔记十二:return_value 返回值
阅读PHP的源码有一段时间了,知道在扩展函数中只要使用PHP_FUNCTION,并且将值赋给return_value就可以返回此函数的值。
然后自己跟踪代码,一直以为有一个return_value这样的全局变量或包含 return_value的全局hashtable存在,然后不停的调试,一直没有发现,
直到今天问了鸟哥后才顿然醒悟,鸟哥在邮件中说:“ return_value是php中所有对php脚本提供函数PHP_FUCTION的一个参数,通过宏展开的。 通过复制给这个参数, ZE会将返回值给前端调用脚本。
在此非常感谢鸟哥的指导。鸟哥的blog地址:http://www.laruence.com/

其宏定义如下:

1
2
3
4
#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的宏代替。
常见的宏如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//    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源码阅读笔记十二:return_value 返回值》上有7条评论

  1. Pingback引用通告: PHP源码分析文章整理 | 牛腩五花肉的博客-linux系统编程

  2. Pingback引用通告: array_change_key_case | 种花生的黄土地

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>