记一次分析别人源码的过程
2016-05-19 20:32
148 查看
最近在读一个别人写的 PHP 框架, 也遇到了一个问题,在这里记录一下。
1、拿到别人写的框架源码,如何分析呢?
我觉得首先弄清楚整个项目的架构,文件组织结构, 然后通过 UML 类图来进行分析,相信会事半功倍的。
2. 有时候读代码的时候,会发现在某个地方调用了 一个函数, 但自己目前找不出这个函数变量是在哪里初始化的。
这个时候怎么办呢??哈哈,我搜索了一下,可以用反射。 以前还以为反射只是用来分析类的(class), 原来反射
还可以用来分析函数的。
比如发现代码会执行下面这个info 函数, 然后info 函数里面会调用 Logger::$writer这个函数, 但是不清楚 Logger::$writer这个函数
是在哪里赋值的, 怎么办呢?
可以用 反射 API 来分析 Logger:$writer 这个函数的内部源代码。
然后浏览器访问一下,就得到了 Logger::$writer 这个函数的源代码了:
![](http://images2015.cnblogs.com/blog/575868/201605/575868-20160519202954998-1855116560.png)
打出这个函数的源代码之后, 我就全文搜索了一下“trigger_error($message.” 发现原来这个函数的定义就是在这个文件里面,咦,看来看得不够仔细。嘿嘿。。。
不过没关系,咋有强大的反射 API , 哈哈。。。
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 这个函数的源代码了:
![](http://images2015.cnblogs.com/blog/575868/201605/575868-20160519202954998-1855116560.png)
打出这个函数的源代码之后, 我就全文搜索了一下“trigger_error($message.” 发现原来这个函数的定义就是在这个文件里面,咦,看来看得不够仔细。嘿嘿。。。
不过没关系,咋有强大的反射 API , 哈哈。。。
相关文章推荐
- MFC——工厂模式——计算器
- LeetCode-118&119.Pascal's Triangle
- AndroidStudio 优秀插件汇总
- 聚类算法(1) ---- K-Means
- rpm包管理 命令
- swift 2.2 语法 (下)
- 第十二周-数组类运算的实现
- 区间DP——1048 石子归并 codevs
- tableView小知识整理(一)
- textview圆角效果
- HDU 5564 Clarke and digits 状压dp+矩阵加速
- 用 SharedPreferences 存储用户名
- 周总结
- 矩阵快速幂计算hdu1575
- js实现windows扫雷(jquery)
- UVA - 11572 Unique Snowflakes
- imx6q 编译下载指南
- 【C程序设计语言(第二版)学习】++ndigit[c-'0']理解
- 大图处理
- hdu1257 最少拦截系统(贪心)