這篇文章主要介紹了關於淺談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中文網其他相關文章!