首頁 >後端開發 >php教程 >淺談PHP原始碼十二:關於return_value 回傳值

淺談PHP原始碼十二:關於return_value 回傳值

不言
不言原創
2018-06-28 17:15:012024瀏覽

這篇文章主要介紹了關於淺談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 回傳值的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn