php - 了解大型 php 代码,使用什么技术?

标签 php reverse-engineering static-analysis

当原始编码员擅离职守时,我收到了用 php 编写的大量未记录的应用程序代码。我的任务是添加新功能,但如果不理解代码我就无法做到这一点。我开始四处寻找。老实说,我对源代码的数量感到不知所措。我发现:

  • 基于 MVC 架构、数据库持久性、模板和 OOP 编写得很好
  • 模块化,有基于URL的路由概念,基本模板
  • 使用没有文档的自定义编写的 php 框架。并且没有源代码控制历史(糟糕!)
  • 有 500 多个文件,每个文件包含数百行代码。每个文件都有 3-4 个 require_once 语句,其中包含大量其他文件,因此很难判断哪个函数/类/方法来自哪里

现在我正在寻找一些我用来理解这段代码的技巧。例如,考虑以下代码片段:

class SiteController extends Common {

private $shared;
private $view;


protected function init(){


    $this->loadShared();
    $this->loadView();


}

private function loadShared(){
    $this->shared = new Home();
}

private function loadView(){
    $this->view = new HomeView();
}

我想知道

  • HomeView()Home() 在哪里定义? $this->shared & this->view 从何而来?我检查了文件的其余部分,没有名为 shared 或 view 的方法。很明显,它们来自使用 require_once() 包含的数百个类中的一个,但是哪一个呢?我怎样才能知道?
  • 我能否获得所有正在执行的函数或方法的列表?如果是,那么如何?
  • 这个类 SiteController 重写基 Common 类。但是我找不到这个 Common 类在哪里。如何判断?

此外,请分享一些用于理解用 php 编写的现有代码的技术?

最佳答案

首先,在这种情况下,我试图获得一个应用程序概览:某种全局概念:

  • 应用程序(不是代码!) 做什么
  • 代码是如何全局组织的:模型、模板、 Controller ……在哪里?
  • 每种类型的组件是如何构建的 - 一旦您知道模型类的工作方式,其他组件通常也会以相同的方式工作。


一旦你有了这个全局想法,开始理解代码如何工作的可能性,如果你有一些时间,那就是使用 PHP 调试器。
关于那个,Xdebug + Eclipse PDT 是一种可能性——但几乎所有现代 IDE 都支持它。

它将允许您逐步、逐行地完成页面的生成,了解调用的内容、时间、位置...

当然,您不会对整个应用程序都这样做!
但是当您的应用程序使用框架时,应用程序的所有部分很有可能以相同的方式工作——这意味着真正理解一个组件应该有助于更容易地理解另一个组件。


作为了解什么调用什么、如何调用以及在何处调用的两个工具,您可能想看看:

  • inclued extension (quoting):允许您在运行时跟踪并转储文件包含和类继承的层次结构
  • Xdebug + KCacheGrind将允许您生成调用图; XHProf应该做同样的事情。
  • 使用您的 IDE ( Eclipse PDT , Zend Studio , phpStorm , netbeans , ...),按住 ctrl 并单击一个类/方法应该会带您进入它的声明。


另请注意,应用程序不仅仅是代码:通常发现对数据库进行逆向工程以生成所有表的图表非常有用。

如果你幸运的话,你的数据库中有外键——这样你就可以在表之间建立链接;这将帮助您了解它们之间的关系。

关于php - 了解大型 php 代码,使用什么技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573116/

相关文章:

php - 如何将在php中创建的变量传递给mysql数据库?

assembly - 如何在反汇编的C/C++程序中重建类型和数据结构?

java - 如何静态检测丢失的@Override 注释?

ruby-on-rails - 如何检查整个 Rails 项目的编译错误

php - 如何在 PHP 中绑定(bind) SQL 变量?

php - 匹配数量和单位的正则表达式

php - 使用 DOT Notations 键数组从多维数组中获取选定的列

c - Ghidra 是否误解了函数调用?

c - 如何 Hook __usercall、__userpurge (__spoils) 函数?

使用arm作为目标进行clang-check