记一次分析别人源码的过程

Posted 牛顿的小脑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次分析别人源码的过程相关的知识,希望对你有一定的参考价值。

最近在读一个别人写的 php 框架, 也遇到了一个问题,在这里记录一下。

1、拿到别人写的框架源码,如何分析呢?

  我觉得首先弄清楚整个项目的架构,文件组织结构, 然后通过 UML 类图来进行分析,相信会事半功倍的。

2. 有时候读代码的时候,会发现在某个地方调用了 一个函数, 但自己目前找不出这个函数变量是在哪里初始化的。

  这个时候怎么办呢??哈哈,我搜索了一下,可以用反射。 以前还以为反射只是用来分析类的(class), 原来反射

还可以用来分析函数的。

比如发现代码会执行下面这个info 函数, 然后info 函数里面会调用 Logger::$writer这个函数, 但是不清楚 Logger::$writer这个函数

是在哪里赋值的, 怎么办呢?

 /**
     * info log
     * @param string $msg
     * @return void
     */
    public static function info($msg){
        call_user_func(Logger::$writer, self::INFO, $msg);
    }

  可以用 反射 API 来分析 Logger:$writer 这个函数的内部源代码。

/**
     * info log
     * @param string $msg
     * @return void
     */
    public static function info($msg){

       ////////////////////////////////////////////////////////
        $func = new \\ReflectionFunction(Logger::$writer);
        $filename = $func->getFileName();
        $start_line = $func->getStartLine() - 1; // it\'s actually - 1, otherwise you wont get the function() block
        $end_line = $func->getEndLine();
        $length = $end_line - $start_line;

        $source = file($filename);
        $body = implode("", array_slice($source, $start_line, $length));
        print_r($body);
        exit();
        ////////////////////////////////////////////////////////

        call_user_func(Logger::$writer, self::INFO, $msg);
    }    

  

 然后浏览器访问一下,就得到了 Logger::$writer 这个函数的源代码了:

打出这个函数的源代码之后, 我就全文搜索了一下“trigger_error($message.” 发现原来这个函数的定义就是在这个文件里面,咦,看来看得不够仔细。嘿嘿。。。

不过没关系,咋有强大的反射 API , 哈哈。。。

以上是关于记一次分析别人源码的过程的主要内容,如果未能解决你的问题,请参考以下文章

记一次源码分析过程,顺便给MyBatis修个Bug

记一次Unity4.x源码编译过程之二:开小灶

记一次源码分析

Unity记一次Amplify Shader Editor-编辑器扩展开发Canvas框架

记一次通过Memory Analyzer分析内存泄漏的解决过程

记一次canal delay 调优过程