记一次分析别人源码的过程
最近在读一个别人写的 PHP 框架, 也遇到了一个问题,在这里记录一下。
1、拿到别人写的框架源码,如何分析呢?
我觉得首先弄清楚整个项目的架构,文件组织结构, 然后通过 UML 类图来进行分析,相信会事半功倍的。
2. 有时候读代码的时候,会发现在某个地方调用了 一个函数, 但自己目前找不出这个函数变量是在哪里初始化的。
这个时候怎么办呢??哈哈,我搜索了一下,可以用反射。 以前还以为反射只是用来分析类的(class), 原来反射
还可以用来分析函数的。
比如发现代码会执行下面这个info 函数, 然后info 函数里面会调用 Logger::$writer这个函数, 但是不清楚 Logger::$writer这个函数
是在哪里赋值的, 怎么办呢?
1 2 3 4 5 6 7 8 | /** * info log * @param string $msg * @return void */ public static function info( $msg ){ call_user_func(Logger:: $writer , self::INFO, $msg ); } |
可以用 反射 API 来分析 Logger:$writer 这个函数的内部源代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** * 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 , 哈哈。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现