Home > Article > Backend Development > A brief discussion of PHP source code 12: About return_value return value
This article mainly introduces a brief discussion on PHP source code 12: Regarding return_value, the return value has a certain reference value. Now I share it with you. Friends in need can refer to it
Read the source code of PHP For some time, I have known that as long as you use PHP_FUNCTION in an extension function and assign the value to return_value, you can return the value of this function.
Then I traced the code myself. I always thought that there was a global variable like return_value or a global hashtable containing return_value. Then I kept debugging, but I never found it.
It wasn’t until I asked Brother Niao today that I suddenly realized, Niao Brother said in the email: "return_value is a parameter in PHP that provides the function PHP_FUCTION to PHP scripts, expanded through macros. By copying this parameter, ZE will return the value to the front-end calling script. "
The macro definition is as follows:
#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
Some built-in functions (such as each) directly use ZEND_FUNCTION
Extension functions use PHP_FUNCTION
In some extension functions we often see that some do not use return_value , but use some macros containing return_value instead.
Common macros are as follows:
// 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; }The above is the entire content of this article. I hope it will be helpful to everyone’s learning. For more related content, please pay attention to the PHP Chinese website!
Related recommendations:
A brief discussion on PHP source code 11: Introduction to array_key_exists, in_array
A brief discussion on PHP source code Ten: About array_keys, array_values functions
A brief discussion on PHP source code Nine: Introduction to array_unshift, array_push
The above is the detailed content of A brief discussion of PHP source code 12: About return_value return value. For more information, please follow other related articles on the PHP Chinese website!