资讯专栏INFORMATION COLUMN

如何查找php核心函数源码

gougoujiang / 467人阅读

摘要:初衷有时候我们会遇到对提供的函数执行结果感到诧异,这时候我们需要看下源码的实现,才能做出更好的解释。包括我们经常使用的一些核心函数,同时也包括等核心类。如何查找源码假设我们想知道怎么实现,只需在整个目录中搜索。

初衷

有时候我们会遇到对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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/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元查看
<