Home  >  Article  >  Backend Development  >  A brief discussion of PHP source code 12: About return_value return value

A brief discussion of PHP source code 12: About return_value return value

不言
不言Original
2018-06-28 17:15:011954browse

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn