摘要:初衷有時候我們會遇到對提供的函數執行結果感到詫異,這時候我們需要看下源碼的實現,才能做出更好的解釋。包括我們經常使用的一些核心函數,同時也包括等核心類。如何查找源碼假設我們想知道怎么實現,只需在整個目錄中搜索。
初衷
有時候我們會遇到對php提供的函數執行結果感到詫異,這時候我們需要看下源碼的實現,才能做出更好的解釋。
代碼結構首先在php.net官網下載php源碼。
下載好的源碼,我們需要重點關注的是ext和zend兩個目錄。其他目錄可以不用關心。
ext目錄下放的是php里面的擴展。包括我們經常使用的一些核心函數(json_encode、json_decode),同時也包括mysqli、PDO等核心類。
如何查找源碼zend目錄下放的是zend引擎的源碼。控制PHP代碼運行時候的運行環境。它處理PHP提供的所有“語言層”的特性,包括:變量,表達式,語法解析,代碼執行和錯誤處理。
假設我們想知道json_encode怎么實現,只需在整個目錄中搜索 _function(json_encode)。就可以發現json_encode的源碼是在json.c文件中的。
同理找strlen方法。
仔細看就會發現,兩個搜索結果略有差異。 一個是PHP_FUNCTION,一個是ZEND_FUNCTION。一個是zend引擎定義的函數,一個是PHP擴展的函數。
在json.c文件中,可以很輕松找出json_encode的實現代碼如下。
/* {{{ proto string json_encode(mixed data [, int options[, int depth]]) Returns the JSON representation of a value */ static PHP_FUNCTION(json_encode) { zval *parameter; smart_str buf = {0}; zend_long options = 0; zend_long depth = PHP_JSON_PARSER_DEFAULT_DEPTH; if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|ll", ¶meter, &options, &depth) == FAILURE) { return; } JSON_G(error_code) = PHP_JSON_ERROR_NONE; JSON_G(encode_max_depth) = (int)depth; php_json_encode(&buf, parameter, (int)options); if (JSON_G(error_code) != PHP_JSON_ERROR_NONE && !(options & PHP_JSON_PARTIAL_OUTPUT_ON_ERROR)) { smart_str_free(&buf); ZVAL_FALSE(return_value); } else { smart_str_0(&buf); /* copy? */ ZVAL_NEW_STR(return_value, buf.s); } } /* }}} */
剩下的就是要讀懂這段代碼,后面再講……o(╯□╰)o
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30413.html
摘要:函數使用格式判斷變量是否為空。對于,如果變量被如的函數設為,則函數會返回。,到分支,,返回數組元素的數量,為空,因此為,,,因此返回。 近日被問到PHP中empty和isset函數時怎么判斷變量的,剛開始我是一臉懵逼的,因為我自己也只是一知半解,為了弄懂其真正的原理,趕緊翻開源碼研究研究。經過分析可發現兩個函數調用的都是同一個函數,因此本文將對兩個函數一起分析。 我在github有對P...
摘要:例子的值是,因此核心源碼調用函數查找如果不是字符串,轉換成數字并賦值為該數字的字符。設置結束字符有一點要注意的是,如果不是字符串的話,會調用函數將轉成整型數字并轉換為其值。變量就是調用函數時傳遞的變量。核心源碼拷貝一份調用函數找出的值。 我在github有對PHP源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。 st...
摘要:如何做用戶認證根據文檔描述,提供用戶認證的接口,他的核心是看守器和提供器,看守器定義怎么認證用戶,提供器定義怎么檢索用戶。 最近的一個PHP項目,上一個項目是采用ThinkPHP來弄的,因為很早就聽說過Laravel的大名,所以進了Laravel的官網,意外發現了Lumen,正好我項目是提供API的,所以選擇了Lumen,因為是Laravel的精簡版,看了幾天的Laravel文檔,也總...
前言 在開始之前,歡迎關注我自己的博客:www.leoyang90.cn上一篇 文章我們講到了 Composer 自動加載功能的啟動與初始化,經過啟動與初始化,自動加載核心類對象已經獲得了頂級命名空間與相應目錄的映射,換句話說,如果有命名空間 AppConsoleKernel,我們已經知道了 App 對應的目錄,接下來我們就要解決下面的就是 ConsoleKernel這一段。 注冊 我們先回顧...
摘要:中詞法語法分析,生成抽象語法樹,然后編譯成及被執行均由虛擬機完成。通常情況下這部分是可選部分,主要為便于程序的讀寫方便而使用。指令虛擬機的指令稱為,每條指令對應一個。 作者 陳雷編程語言的虛擬機是一種可以運行中間語言的程序。中間語言是抽象出的指令集,由原生語言編譯而成,作為虛擬機執行階段的輸入。很多語言都實現了自己的虛擬機,比如Java、C#和Lua。PHP語言也有自己的虛擬機,稱為Z...
閱讀 2211·2019-08-30 15:54
閱讀 1947·2019-08-30 13:49
閱讀 665·2019-08-29 18:44
閱讀 824·2019-08-29 18:39
閱讀 1104·2019-08-29 15:40
閱讀 1524·2019-08-29 12:56
閱讀 3134·2019-08-26 11:39
閱讀 3094·2019-08-26 11:37