成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何查找php核心函數(shù)源碼

gougoujiang / 584人閱讀

摘要:初衷有時(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

相關(guān)文章

  • [PHP源碼閱讀]empty和isset函數(shù)

    摘要:函數(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...

    Pink 評論0 收藏0
  • [PHP源碼閱讀]strpos、strstr和stripos、stristr函數(shù)

    摘要:例子的值是,因此核心源碼調(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...

    derek_334892 評論0 收藏0
  • Lumen用戶認(rèn)證JWT,源碼解讀

    摘要:如何做用戶認(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文檔,也總...

    AZmake 評論0 收藏0
  • Composer的Autoload源碼實(shí)現(xiàn)——注冊與運(yùn)行

    前言 在開始之前,歡迎關(guān)注我自己的博客:www.leoyang90.cn上一篇 文章我們講到了 Composer 自動加載功能的啟動與初始化,經(jīng)過啟動與初始化,自動加載核心類對象已經(jīng)獲得了頂級命名空間與相應(yīng)目錄的映射,換句話說,如果有命名空間 AppConsoleKernel,我們已經(jīng)知道了 App 對應(yīng)的目錄,接下來我們就要解決下面的就是 ConsoleKernel這一段。 注冊 我們先回顧...

    wanghui 評論0 收藏0
  • PHP7源碼分析】PHP7源碼研究之淺談Zend虛擬機(jī)

    摘要:中詞法語法分析,生成抽象語法樹,然后編譯成及被執(zhí)行均由虛擬機(jī)完成。通常情況下這部分是可選部分,主要為便于程序的讀寫方便而使用。指令虛擬機(jī)的指令稱為,每條指令對應(yīng)一個(gè)。 作者 陳雷編程語言的虛擬機(jī)是一種可以運(yùn)行中間語言的程序。中間語言是抽象出的指令集,由原生語言編譯而成,作為虛擬機(jī)執(zhí)行階段的輸入。很多語言都實(shí)現(xiàn)了自己的虛擬機(jī),比如Java、C#和Lua。PHP語言也有自己的虛擬機(jī),稱為Z...

    馬龍駒 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<