在咱们开发项目的过程当中,不可避免的会使用一些开软程序,由于使用开源程序能够缩短咱们的开发周期,下降研发成本。php
可是在使用过程当中,不免会碰到各类坑,这个时候,就要求程序员拥有分析开源项目的能力,由于并不是是全部开源项目都会拥有一个稳定的维护团队和健全的文档(毕竟开源项目不多有盈利的)。git
在进行 PHP 研发过程当中,咱们可使用如下5中方式来进行代码分析:程序员
为何要把看文档排在第一位?github
当咱们第一次拿到开源程序的代码时,不少人会第一反应去看它的源代码,可是若是说咱们要了解它的编程思想,就看编程思想而言是看文档,仍是看代码要容易呢?ajax
若是在不了解开源代码的功能就去了解代码的话,其实很难可以弄懂他的编程思想。thinkphp
有时候开源程序没有提供文档,咱们可使用 PHPDocumentor 将注释提取成文档。编程
PHPDocumentor: http://www.phpdoc.org/
使用 Xdebug 调试代码api
咱们可使用 Xdebug 联合 IDE 经过断点调试放慢代码执行流程,当程序执行到用户指定的断点后,能够到该位置停顿,而后输出在该变量中的值,能够一步一步的分析代码,若是碰到难懂的代码就能够经过这种形式来进行调试代码。数组
Xdebug: https://xdebug.org
PHP自带函数浏览器
打出调用栈:
debug_backtrace(); debug_print_backtrace();
若是咱们本身去看执行流程,就要跟着函数一步一步的走,但是若是使用调用栈,就能够清晰明了的看清。
<?php namespace app\index\controller; class Index { public function index() { dump(debug_backtrace());exit; } }
咱们能够经过这两个函数查看 ThinkPHP 是如何调用控制器的,在这里,我使用的 ThinkPHP5.0,在这里咱们须要从下往上看。
array(7) { [0] => array(5) { ["function"] => string(5) "index" ["class"] => string(26) "app\index\controller\Index" ["object"] => object(app\index\controller\Index)#3 (0) { } ["type"] => string(2) "->" ["args"] => array(0) { } } [1] => array(7) { ["file"] => string(70) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/App.php" ["line"] => int(343) ["function"] => string(10) "invokeArgs" ["class"] => string(16) "ReflectionMethod" ["object"] => object(ReflectionMethod)#4 (2) { ["name"] => string(5) "index" ["class"] => string(26) "app\index\controller\Index" } ["type"] => string(2) "->" ["args"] => array(2) { [0] => object(app\index\controller\Index)#3 (0) { } [1] => array(0) { } } } //.....省略 }
咱们能够来分析一下 ThinkPHP5.0的调用步骤:ß
debug_backtrace 显示的是详细信息,若是想要简单的查看调用,可使用debug_print_backtrace
函数直接打印输出堆栈的调用信息。
这样咱们就能够分析出,ThinkPHP 的执行流程,也就四五分钟的时间。
当咱们须要输出变量的时候,咱们应该使用 var_dump(),由于var_dump 能够直观的看出数组的结构。
当咱们在在向日志文件输出数组的时候,咱们可使用 var_export()
进行输出。
<?php $a = array (1, 2, array ("a", "b", "c")); var_export ($a); /* 输出: array ( 0 => 1, 1 => 2, 2 => array ( 0 => 'a', 1 => 'b', 2 => 'c', ), ) */
另外咱们能够经过 get_included_files来获取当前脚本文件都加载了哪些文件。
array(23) { [0] => string(56) "/Users/maksim/Downloads/thinkphp_5.0.20/public/index.php" [1] => string(58) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/start.php" [2] => string(57) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/base.php" [3] => string(73) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Loader.php" [4] => string(75) "/Users/maksim/Downloads/thinkphp_5.0.20/vendor/composer/autoload_static.php" [5] => string(72) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Error.php" [6] => string(73) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Config.php" [7] => string(63) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/convention.php" [8] => string(70) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/App.php" [9] => string(74) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Request.php" [10] => string(62) "/Users/maksim/Downloads/thinkphp_5.0.20/application/config.php" [11] => string(64) "/Users/maksim/Downloads/thinkphp_5.0.20/application/database.php" [12] => string(67) "/Users/maksim/Downloads/thinkphp_5.0.20/application/extra/queue.php" [13] => string(71) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Hook.php" [14] => string(60) "/Users/maksim/Downloads/thinkphp_5.0.20/application/tags.php" [15] => string(62) "/Users/maksim/Downloads/thinkphp_5.0.20/application/common.php" [16] => string(70) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Env.php" [17] => string(59) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/helper.php" [18] => string(71) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Lang.php" [19] => string(63) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/lang/zh-cn.php" [20] => string(61) "/Users/maksim/Downloads/thinkphp_5.0.20/application/route.php" [21] => string(72) "/Users/maksim/Downloads/thinkphp_5.0.20/thinkphp/library/think/Route.php" [22] => string(78) "/Users/maksim/Downloads/thinkphp_5.0.20/application/index/controller/Index.php" }
上面都是用PHP 自带的函数来作代码分析,下面来说解一下利用 SocketLog 来分析源代码。
SocketLog 能够把咱们的一些日志打到浏览器的调试工具上面。
好比说 SQL 语句,点开后能够查看调用栈,经过这些信息,咱们就能够快速定位咱们想要修改的代码。其实 SocketLog 还能够作微信调试。
详细的使用方法能够经过 github 进行查看:
https://github.com/luofei614/...
咱们能够经过一些思惟导图的工具来帮助咱们分析业务逻辑。
咱们还能够经过 UML 图形来整理类之间的关系,咱们能够看 《大象UML 》来了解 UML 建模。