国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何查找php核心函數源碼

gougoujiang / 576人閱讀

摘要:初衷有時候我們會遇到對提供的函數執行結果感到詫異,這時候我們需要看下源碼的實現,才能做出更好的解釋。包括我們經常使用的一些核心函數,同時也包括等核心類。如何查找源碼假設我們想知道怎么實現,只需在整個目錄中搜索。

初衷

有時候我們會遇到對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函數

    摘要:函數使用格式判斷變量是否為空。對于,如果變量被如的函數設為,則函數會返回。,到分支,,返回數組元素的數量,為空,因此為,,,因此返回。 近日被問到PHP中empty和isset函數時怎么判斷變量的,剛開始我是一臉懵逼的,因為我自己也只是一知半解,為了弄懂其真正的原理,趕緊翻開源碼研究研究。經過分析可發現兩個函數調用的都是同一個函數,因此本文將對兩個函數一起分析。 我在github有對P...

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

    摘要:例子的值是,因此核心源碼調用函數查找如果不是字符串,轉換成數字并賦值為該數字的字符。設置結束字符有一點要注意的是,如果不是字符串的話,會調用函數將轉成整型數字并轉換為其值。變量就是調用函數時傳遞的變量。核心源碼拷貝一份調用函數找出的值。 我在github有對PHP源碼更詳細的注解。感興趣的可以圍觀一下,給個star。PHP5.4源碼注解。可以通過commit記錄查看已添加的注解。 st...

    derek_334892 評論0 收藏0
  • Lumen用戶認證JWT,源碼解讀

    摘要:如何做用戶認證根據文檔描述,提供用戶認證的接口,他的核心是看守器和提供器,看守器定義怎么認證用戶,提供器定義怎么檢索用戶。 最近的一個PHP項目,上一個項目是采用ThinkPHP來弄的,因為很早就聽說過Laravel的大名,所以進了Laravel的官網,意外發現了Lumen,正好我項目是提供API的,所以選擇了Lumen,因為是Laravel的精簡版,看了幾天的Laravel文檔,也總...

    AZmake 評論0 收藏0
  • Composer的Autoload源碼實現——注冊與運行

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

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

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

    馬龍駒 評論0 收藏0

發表評論

0條評論

gougoujiang

|高級講師

TA的文章

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