В кодовой базе одного из моих клиентов я вижу много ссылок на квалифицированное имя класса в виде строки;
[
'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 работает для каждого файла отдельно.
Последний вариант, о котором я мог подумать, тоже довольно грязный; поскольку мы всегда используем композитор в наших проектах, мы могли бы взять файлы автозагрузки композитора и попытаться сопоставить их с картами классов и пространствами имен. Тоже не очень надежный и чистый.
У кого-нибудь есть другое предложение, о котором мы не подумали?!