摘要:初衷有時(shí)候我們會遇到對提供的函數(shù)執(zhí)行結(jié)果感到詫異,這時(shí)候我們需要看下源碼的實(shí)現(xiàn),才能做出更好的解釋。包括我們經(jīng)常使用的一些核心函數(shù),同時(shí)也包括等核心類。如何查找源碼假設(shè)我們想知道怎么實(shí)現(xiàn),只需在整個(gè)目錄中搜索。
初衷
有時(shí)候我們會遇到對php提供的函數(shù)執(zhí)行結(jié)果感到詫異,這時(shí)候我們需要看下源碼的實(shí)現(xiàn),才能做出更好的解釋。
代碼結(jié)構(gòu)首先在php.net官網(wǎng)下載php源碼。
下載好的源碼,我們需要重點(diǎn)關(guān)注的是ext和zend兩個(gè)目錄。其他目錄可以不用關(guān)心。
ext目錄下放的是php里面的擴(kuò)展。包括我們經(jīng)常使用的一些核心函數(shù)(json_encode、json_decode),同時(shí)也包括mysqli、PDO等核心類。
如何查找源碼zend目錄下放的是zend引擎的源碼。控制PHP代碼運(yùn)行時(shí)候的運(yùn)行環(huán)境。它處理PHP提供的所有“語言層”的特性,包括:變量,表達(dá)式,語法解析,代碼執(zhí)行和錯(cuò)誤處理。
假設(shè)我們想知道json_encode怎么實(shí)現(xiàn),只需在整個(gè)目錄中搜索 _function(json_encode)。就可以發(fā)現(xiàn)json_encode的源碼是在json.c文件中的。
同理找strlen方法。
仔細(xì)看就會發(fā)現(xiàn),兩個(gè)搜索結(jié)果略有差異。 一個(gè)是PHP_FUNCTION,一個(gè)是ZEND_FUNCTION。一個(gè)是zend引擎定義的函數(shù),一個(gè)是PHP擴(kuò)展的函數(shù)。
在json.c文件中,可以很輕松找出json_encode的實(shí)現(xiàn)代碼如下。
/* {{{ 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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30413.html
摘要:函數(shù)使用格式判斷變量是否為空。對于,如果變量被如的函數(shù)設(shè)為,則函數(shù)會返回。,到分支,,返回?cái)?shù)組元素的數(shù)量,為空,因此為,,,因此返回。 近日被問到PHP中empty和isset函數(shù)時(shí)怎么判斷變量的,剛開始我是一臉懵逼的,因?yàn)槲易约阂仓皇且恢虢?,為了弄懂其真正的原理,趕緊翻開源碼研究研究。經(jīng)過分析可發(fā)現(xiàn)兩個(gè)函數(shù)調(diào)用的都是同一個(gè)函數(shù),因此本文將對兩個(gè)函數(shù)一起分析。 我在github有對P...
摘要:例子的值是,因此核心源碼調(diào)用函數(shù)查找如果不是字符串,轉(zhuǎn)換成數(shù)字并賦值為該數(shù)字的字符。設(shè)置結(jié)束字符有一點(diǎn)要注意的是,如果不是字符串的話,會調(diào)用函數(shù)將轉(zhuǎn)成整型數(shù)字并轉(zhuǎn)換為其值。變量就是調(diào)用函數(shù)時(shí)傳遞的變量。核心源碼拷貝一份調(diào)用函數(shù)找出的值。 我在github有對PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。 st...
摘要:如何做用戶認(rèn)證根據(jù)文檔描述,提供用戶認(rèn)證的接口,他的核心是看守器和提供器,看守器定義怎么認(rèn)證用戶,提供器定義怎么檢索用戶。 最近的一個(gè)PHP項(xiàng)目,上一個(gè)項(xiàng)目是采用ThinkPHP來弄的,因?yàn)楹茉缇吐犝f過Laravel的大名,所以進(jìn)了Laravel的官網(wǎng),意外發(fā)現(xiàn)了Lumen,正好我項(xiàng)目是提供API的,所以選擇了Lumen,因?yàn)槭荓aravel的精簡版,看了幾天的Laravel文檔,也總...
前言 在開始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn上一篇 文章我們講到了 Composer 自動加載功能的啟動與初始化,經(jīng)過啟動與初始化,自動加載核心類對象已經(jīng)獲得了頂級命名空間與相應(yīng)目錄的映射,換句話說,如果有命名空間 AppConsoleKernel,我們已經(jīng)知道了 App 對應(yīng)的目錄,接下來我們就要解決下面的就是 ConsoleKernel這一段。 注冊 我們先回顧...
摘要:中詞法語法分析,生成抽象語法樹,然后編譯成及被執(zhí)行均由虛擬機(jī)完成。通常情況下這部分是可選部分,主要為便于程序的讀寫方便而使用。指令虛擬機(jī)的指令稱為,每條指令對應(yīng)一個(gè)。 作者 陳雷編程語言的虛擬機(jī)是一種可以運(yùn)行中間語言的程序。中間語言是抽象出的指令集,由原生語言編譯而成,作為虛擬機(jī)執(zhí)行階段的輸入。很多語言都實(shí)現(xiàn)了自己的虛擬機(jī),比如Java、C#和Lua。PHP語言也有自己的虛擬機(jī),稱為Z...
閱讀 2224·2019-08-30 15:54
閱讀 1960·2019-08-30 13:49
閱讀 679·2019-08-29 18:44
閱讀 834·2019-08-29 18:39
閱讀 1118·2019-08-29 15:40
閱讀 1538·2019-08-29 12:56
閱讀 3151·2019-08-26 11:39
閱讀 3104·2019-08-26 11:37