2016-08-25 13 views
5

내 클라이언트 중 하나의 코드베이스에서 정규화 된 클래스 이름에 대한 참조가 문자열로 많이 표시됩니다. 사용하는 대신PHP 코드 네이 퍼 사용자 정의 규칙 : 문자열 대신 constant :: class

[ 
    'foobar' => 'My\Namespace\Class' 
] 

: 우리는 이러한 문자열을 잡으려고 PHP CodeSniffer 규칙을 추가하고 문자열이 :: 클래스에 리팩토링 할 수 있도록 경고를 추가 할 몇 가지 이유를 들어

[ 
    'foobar' => My\Namespace\Class::class 
] 

일정한. 첫 번째 부분 (문자열 잡기)은 쉽지만 정적 코드 분석을 수행하기 때문에 (예를 들어) class_exists를 수행하거나 get_declared_classes()의 결과를 조회 할 수 없습니다.

다음 옵션은 문자열 자체 ([A-Za-z0-9])를 분석 할 수 있지만 많은 문자열이 일치하지만 클래스 이름이 아니기 때문에 매우 안정적이지 않습니다.

다른 옵션은 먼저 모든 클래스 이름 (T_CLASS 토큰을 기반으로 함)을 수집하고 수집 된 클래스 목록을 기반으로 모든 문자열을 분석하는 것입니다. CodeSniffer가 파일 단위로 작동하기 때문에 IMHO를 구현하기가 쉽지 않습니다.

내가 생각할 수있는 마지막 옵션도 상당히 더러 웠습니다. 우리는 항상 프로젝트에서 작곡가를 사용하기 때문에 작곡가의 파일을 자동으로 불러 와서 클래스 맵과 네임 스페이스와 대조해 볼 수 있습니다. 또한 매우 안정적이지 않고 깨끗합니다.

다른 제안이있는 사람이 있습니까?

+0

나에게 잘 어울리는군요, 얼마나 멀리 받았습니까? 이것이 내 이슈 목록에 있기 때문에 그걸 도와 드릴 수 있습니다. –

+0

죄송합니다, 진전이 없습니다. 아직 조사하지는 않았지만 PHPStan과 같은 정적 코드 분석 도구가 이미이를 수행 할 수 있다고 상상할 수 있습니다. – Arjan

+0

문제 없습니다. 이 문제에 대해 언제든지 보거나 공저 할 수 있습니다. https://github.com/Symplify/Symplify/issues/59 빌드하는 데 도움이 될 수 있습니다. PHPStan은 코드 만 분석하고 아무 것도 변경하지 않습니다. –

답변

2

좋은 소식! 이 픽머를 만들었습니다 - you can find it here.

# easy-coding-standard.neon 
checkers: 
    - Symplify\CodingStandard\Fixer\Php\ClassStringToClassConstantFixer 

를 설치합니다 :

가장 좋은 이런 EasyCodingStandard와 함께 사용하는 것입니다

composer require --dev symplify\coding-standard 
composer require --dev symplify\easy-coding-standard 

실행을 그것을 :

vendor/bin/ecs check src 

수정이 :

vendor/bin/ecs check src --fix 

어떻게 작동하는지 알려주세요.

문제가 발생하면 create an issue here입니다. 가능한 한이 도구를 개선하는 것이 기쁩니다.