zoukankan      html  css  js  c++  java
  • 记一次分析别人源码的过程

    最近在读一个别人写的 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 , 哈哈。。。

  • 相关阅读:
    VirtualBox 收缩 vdi镜像文件
    虚拟机安装Lubuntu
    做一个平均数,合计数的sql查询
    postgersql 中 字段名,表名,命名大小写问题(原创)
    你人生中的那口井挖了没有?(转潇湘隐者)
    【智能无线小车系列十一】智能小车一体化测试
    【智能无线小车系列二】车体的组装
    【智能无线小车系列一】物品采购
    【智能无线小车系列十】通过USB摄像头实现网络监控功能
    【智能无线小车系列九】在树莓派上使用USB摄像头
  • 原文地址:https://www.cnblogs.com/oxspirt/p/5510020.html
Copyright © 2011-2022 走看看