Пользовательское правило PHP Codesniffer: константа :: class вместо строки

В кодовой базе одного из моих клиентов я вижу много ссылок на квалифицированное имя класса в виде строки;

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

Вместо использования:

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

По нескольким причинам мы хотим добавить правило PHP CodeSniffer для перехвата этих строк и добавить предупреждение, чтобы строку можно было преобразовать в константу ::class. Первая часть (перехват строки) проста, но поскольку мы проводим статический анализ кода, мы не можем, например, выполнить class_exists или просмотреть результаты get_declared_classes().

Следующим вариантом может быть анализ самой строки ([A-Za-z0-9]), но это не очень надежно, потому что многие строки будут совпадать, но не должны быть именем класса.

Другой вариант — сначала «собрать» все имена классов (на основе токена T_CLASS), а затем проанализировать все строки на основе собранного списка классов. Не очень легко реализовать IMHO, потому что CodeSniffer работает для каждого файла отдельно.

Последний вариант, о котором я мог подумать, тоже довольно грязный; поскольку мы всегда используем композитор в наших проектах, мы могли бы взять файлы автозагрузки композитора и попытаться сопоставить их с картами классов и пространствами имен. Тоже не очень надежный и чистый.

У кого-нибудь есть другое предложение, о котором мы не подумали?!


person Arjan    schedule 25.08.2016    source источник
comment
Выглядит отлично для меня, как далеко вы получили? Я могу помочь вам с этим, так как это в моем списке задач.   -  person Tomas Votruba    schedule 12.05.2017
comment
Извините, пока нет прогресса. Я еще не исследовал, но могу представить, что инструменты статического анализа кода, такие как PHPStan, уже могут это делать.   -  person Arjan    schedule 13.07.2017
comment
Без проблем. Не стесняйтесь смотреть или совместно работать над этой проблемой: github.com/Symplify/Symplify/issues/59 Я мог бы помочь вам построить это. PHPStan только анализирует код, ничего не меняет.   -  person Tomas Votruba    schedule 13.07.2017
comment
Работа ведется здесь: github.com/Symplify/Symplify/pull/262   -  person Tomas Votruba    schedule 14.07.2017
comment
И сделано: github.com/Symplify/Symplify/blob/master/packages/ :) Вы можете использовать с EasyCodingStandard (рекомендуется) или PHP-CS-Fixer   -  person Tomas Votruba    schedule 15.07.2017


Ответы (1)


Хорошие новости! Я создал это средство исправления – вы можете найти здесь.

Лучше всего использовать его с EasyCodingStandard следующим образом:

# ecs.yml
services:
    Symplify\CodingStandard\Fixer\Php\ClassStringToClassConstantFixer: ~

Установить:

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

Бежать:

vendor/bin/ecs check src

Исправить:

vendor/bin/ecs check src --fix

Наслаждайтесь и дайте мне знать, как это работает для вас.

Если возникнут какие-либо проблемы, просто создайте здесь задачу. Я буду рад максимально улучшить этот инструмент.

person Tomas Votruba    schedule 15.07.2017