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!