codesniffer嗅探用于生成php代码的依赖图



目标:我有兴趣在PHP程序中生成类依赖性的点格式描述。

想法:编写可以检测(并发出DOT记录)的codesniffer的"嗅探"不应该很难:

中的以下模式
class SomeClassName extends BasicClassName {  // SomeClassName refers to BasicClassName
...
    new OtherClassName();            // SomeClassName refers to OtherClassName
    ThisClassName::some_method();    // SomeClassName refers to ThisClassName
    ThatClassName::$some_member;     // SomeClassName refers to ThatClassName
    RandomClassName::some_constant;  // SomeClassName refers to RandomClassName
...
}

,但我没有发现任何已发表的嗅探来发出此信息(以及任何其他指示我可能错过的"真实"类依赖关系的模式)。

注意:我专门做不是关心php include()和require()语句(我不相信其行为甚至是明确定义的)。出于这个问题的目的,让我们假设所有PHP类分辨率都是通过自动加载来处理的,并且我们希望仅使用静态代码分析来构建类依赖图。

编辑:不幸的是,我看不到以下一般方法:

class ThatClassName {
...
    function generateClassName() {
        // something too complicated to analyze statically...
    }
    function foo() {
        $name = $this->generateClassName();
        $instance = new $name; // ThatClassName refers to ... what?
        ...
    }
...
}

当然,可以通过显示依赖性对generateClassName()方法的classname来表示依赖关系图中的情况 - 也许与parens一起显示,以使方法名称易于区分与类名称。建立一个惯例可能并不是一个坏主意,即任何一个动态生成类名称的方法都必须包含注释(在关联的注释中),该注释指示了可能生成的每个类名称 - 这些"已记录的"动态依赖"然后可以自动包含在依赖关系图中。

这并不是php_codesniffer设计的。特别是因为嗅探不应该输出数据或写入文件。但是,肯定没有什么可以阻止您在嗅探中这样做。毕竟这只是PHP代码,不需要报告任何错误或警告。

我没有遇到任何像您所描述的那样做任何事情的嗅探,所以我认为您必须写一个新的。

如果您想创建新的嗅觉,我建议您从抽象的范围嗅探开始。这使您可以在t_class令牌中查找t_new和t_double_colon令牌。这是一个例子。

或,如果您还想查看全局功能和其他外部代码,则可以在常规嗅探中查找t_new和t_double_colon令牌

如果您不确定如何入门,或者您只想提供一些帮助写嗅觉,请与我联系,我可以帮助您写这件事。我只需要知道您想要的每种情况所需的输出,否则我只能使用基本的东西。如果您想要一只手,我的电子邮件是:gsherwood at squiz dot net

我为此写了一个工具:phpDependencyAnalysis。

这是基于名称空间的面向对象的PHP项目(> = 5.3.3)的可广泛静态代码分析。它在可自定义的级别上创建依赖图图,例如在包装级或类级上。因此,通常可以根据遵守关注点,麦内特法和无循环依赖性原则来宣布依赖关系,但也可以使用分层体系结构中对层之间的侵犯进行检测。您也可以将输出格式更改为点。

只需检查github上的phpDepentencyAnalysis。

最新更新