2012-11-12 2 views
4

목표 : PHP 프로그램에서 클래스 종속성에 대한 설명을 DOT Format 생성하는 데 관심이 있습니다.PHP 코드의 종속성 그래프를 생성하는 CodeSniffer 스 니프?

IDEA : PHP 소스에서 다음과 같은 패턴을 감지 할 수있는 CodeSniffer "냄새"를 쓰기 (및 DOT 기록을 방출) 열심히 안 :

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 
... 
} 

하지만를 I 피난처 ' 어떤 공개 된 스 니프가이 정보 (그리고 내가 놓칠지도 모르는 "진짜"계급 의존 관계를 나타내는 다른 패턴)를 방출하는 것을 발견하지 못했습니다.

참고 : 내가 특별히 PHP의에 대해 하지 치료를 할 수는 include()와 require() 문 (whose behavior I'm not convinced is even well-defined). 이 질문의 목적을 위해 모든 PHP 클래스 분석이 autoloading을 통해 처리되고 정적 종속성 분석 만 사용하여 클래스 종속성 다이어그램을 작성한다고 가정 해 보겠습니다.

편집 : 불행하게도, 내가 처리 할 일반적인 방법을 볼 다음

class ThatClassName { 
... 
    function generateClassName() { 
     // something too complicated to analyze statically... 
    } 

    function foo() { 
     $name = $this->generateClassName(); 
     $instance = new $name; // ThatClassName refers to ... what? 
     ... 
    } 
... 
} 

그러나 물론 종속성과 ThatClassName을 보여 종속성 그래프에서이 시나리오를 대표 할 수있을 것입니다 generateClassName() 메소드에서 - 메소드 이름을 클래스 이름과 쉽게 구별 할 수 있도록 parens로 표시된다. 그리고 클래스 이름을 동적으로 생성하는 모든 메소드가 생성 될 수있는 모든 클래스 이름을 나타내는 annotation (연관된 주석에 있음)을 포함해야한다는 규칙을 설정하는 것은 좋지 않습니다. 이러한 "문서화 된 동적 종속성" 그런 다음 종속성 그래프에 자동으로 포함될 수 있습니다.

+0

DOT 형식에 대한 링크가 죽었습니다. 문제를 해결하십시오. –

+0

고마워, @ BobKruithof - 링크가 수정되었습니다. – Peter

답변

2

이것은 PHP_CodeSniffer가 설계 한 것이 아닙니다. 스 니프가 데이터를 출력하거나 파일에 쓰지 않아야하기 때문입니다. 그러나, 당신이 냄새 맡는 것 안에서 이것을하는 것을 멈추게하는 것은 아무것도 없습니다. 결국 PHP 코드 일 뿐이며 오류나 경고를보고 할 필요가 없습니다.

나는 당신이 묘사하는 것과 같은 일을하는 어떤 냄새를 발견하지 못했기 때문에 새로운 것을 써야한다고 생각합니다.

새로운 스 니프를 만들고 싶다면 추상적 인 스코프 스 니프부터 시작하는 것이 좋습니다. 이렇게하면 T_CLASS 토큰 내에서 T_NEW 및 T_DOUBLE_COLON 토큰을 찾을 수 있습니다. 당신은 또한 전역 함수와 다른 코드 외부 클래스 보길 원하는 경우에 당신이 시작하는 방법을 잘 모르는 경우 또는, 당신은 단지 일반적인 냄새

내부 T_NEW 및 T_DOUBLE_COLON 토큰 찾아보실 수 있습니다 Here is an example.

또는, 당신은 그저 냄새를 쓰는 데 도움이 필요하고, 저에게 연락하십시오. 그리고 저는 이것을 당신과 쓰는 것을 도울 수 있습니다. 내가 찾은 사례마다 원하는 결과가 무엇인지 알 필요가 있거나 단지 기본적인 것을 사용할 수 있습니다. 손을 원한다면 내 이메일은 gsherwood at squiz dot net

+1

안녕하세요 그렉, 나는 많은 "표준"CodeSniffer 냄새를 맡은 사람으로 당신을 알고 있으며, 도와 주겠다는 제안은 많은 감사를드립니다 (참고로 감사드립니다). 물론 Codesniffer는 코딩 스타일 표준에 대한 적합성을 검사하도록 설계되었지만 CodeSniffer는 구문 정보를 사용하여 ** 전체 코드베이스를 구문 분석하여 모든 종류의 정적 분석 작업을 수행하는 이상적인 플랫폼으로 인식합니다. 예를 들어, 오토로더에서 사용할 파일 -> 클래스 맵을 생성하기 위해 또 다른 "Generic"스니핑 (당신의?)을 수정하여 중복 된 클래스 이름을 찾습니다. – Peter

+1

나는 귀하의 추천대로 냄새를 맡으십시오. 문제가 생기면 나는 당신의 제안을 이용하여 도움을 얻을 것입니다. 그리고 뭔가 효과가 있으면 CodeSniffer 배포본에 추가 할 것을 제안 할 것입니다. (누군가 다른 사람이 언젠가는 유용 할 것이라고 확신하기 때문에). – Peter

+0

그것은 위대한 피터 소리. 나는 또한 PHP_CodeSniffer 자체를 유지하고 있으므로 토큰 화나 코어 코드에 문제가 발생하면 연락하여 알려 주시면 도움을 줄 수 있는지 알아 보겠습니다. 그것이 PHPCS가 설계된 것이 아니지만, 나는 그것이 어떻게 진행되는지보고 싶어하고, 한 번 일하면 다시 공헌하는 것을 좋아할 것입니다. –

1

이 도구를 작성했습니다 : PhpDependencyAnalysis.

이것은 네임 스페이스에 기반한 객체 지향 PHP 프로젝트 (> = 5.3.3)를위한 확장 가능한 정적 코드 분석입니다. 그것은 커스터마이즈 가능한 레벨들에 대한 의존성 그래프를 생성합니다. 패키지 수준 또는 클래스 수준.따라서 일반적으로 종속성을 선언하는 데 유용하지만 분리 분리, 법율 법 및 비주기 종속성 원칙에 따라 계층 구조에서 계층 간 위반 탐지를 수행하는 데에도 유용합니다. 출력 형식을 DOT으로 변경할 수도 있습니다.

PhpDependencyAnalysis on GitHub을 확인하십시오.

+0

링크를 제공해 주셔서 감사합니다! 이것은 흥미롭고 잠재적으로 매우 유용합니다. 콜 그래프에 대한 (아주 좋은) 문서에서 "호출은 메서드 매개 변수, 메서드 반환 값 또는 인스턴스 생성 일 수 있습니다." 당신의 툴은 현명한 방법으로 객체 인스턴스 생성을 추적 할만큼 똑똑합니까? 아니면 "new"를 통해서만 생성을 인식합니까? – Peter

관련 문제