2016-08-25 12 views
5

W kodzie jednego z moich klientów, widzę wiele odniesień do kwalifikowanej nazwy klasy jako ciąg znaków;PHP Codesniffer zwyczaj zasada: stała :: klasa zamiast napisu

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

Zamiast:

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

Przez kilka powodów chcemy dodać regułę PHP CodeSniffer złapać tych ciągów i dodać ostrzeżenie więc ciąg może być refactored do klasy :: stały. Pierwsza część (przechwycenie ciągu znaków) jest łatwa, ale ponieważ wykonujemy statyczną analizę kodu, nie możemy wykonać (na przykład) class_exists ani wyszukać wyników get_declared_classes().

Następną opcją może być analiza samego napisu ([A-Za-z0-9]), ale nie jest to zbyt wiarygodne, ponieważ wiele ciągów będzie pasować, ale nie ma być nazwą klasy.

Inną opcją jest pierwszy „zbierać” wszystkie classnames (na podstawie T_CLASS tokena) i analizować wszystkie sznurki po że na podstawie zebranego wykazu klas. Niezbyt łatwe wdrożenie IMHO, ponieważ CodeSniffer działa na zasadzie pliku.

Ostatnia opcja, o której mógłbym pomyśleć, jest również dość brudna; ponieważ zawsze używamy kompozytora w naszych projektach, możemy wziąć automatyczne ładowanie plików kompozytora i starać się dopasować do map klas i przestrzeni nazw. Również niezbyt niezawodne i czyste.

Ktoś z inną sugestią, o której nie myśleliśmy ?!

+0

Wygląda świetnie, jak daleko się dostałeś? Mogę ci w tym pomóc, ponieważ jest to na mojej liście problemów. –

+0

Niestety, nie poczyniono żadnych postępów. Nie zbadałem jeszcze, ale mogę sobie wyobrazić, że narzędzia do analizy kodu statycznego, takie jak PHPStan, są już w stanie to zrobić. – Arjan

+0

Bez problemu. Zapraszam do obejrzenia lub omówienia tego problemu: https://github.com/Symplify/Symplify/issues/59 Mogę pomóc Ci to zbudować. PHPStan analizuje tylko kod, niczego nie zmienia. –

Odpowiedz

2

Dobra wiadomość! Stworzyłem ten fixer - you can find it here.

Najlepiej jest używać go z EasyCodingStandard jak ten:

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

zainstalować go:

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

Uruchom go:

vendor/bin/ecs check src 

Fix:

vendor/bin/ecs check src --fix 

Ciesz się i daj mi znać, jak to działa.

Jeśli jakieś kłopoty wymyślić, tylko create an issue here. Z chęcią poprawię to narzędzie tak bardzo, jak to możliwe.