ЦЕЛЬ: Я заинтересован в создании описания формата DOT для зависимостей классов в программе PHP.
ИДЕЯ: Нетрудно написать «sniff» CodeSniffer, который может обнаружить (и испустить записи DOT) следующие шаблоны в PHP-источнике:
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 ... }
Но я не нашел опубликованных нюхов, чтобы испускать эту информацию (и любые другие шаблоны, указывающие на «реальное» отношение зависимости класса, которое я, возможно, пропустил).
ПРИМЕЧАНИЕ. Мне особо не нужны инструкции include () и require () PHP ( поведение которых я не убежден, даже четко определено ). Для целей этого вопроса предположим, что все разрешения класса PHP обрабатываются с помощью автозагрузки , и мы хотим использовать только статический анализ кода для построения диаграммы зависимости класса.
EDIT: К сожалению, я не вижу общего способа справиться со следующим:
class ThatClassName { ... function generateClassName() { // something too complicated to analyze statically... } function foo() { $name = $this->generateClassName(); $instance = new $name; // ThatClassName refers to ... what? ... } ... }
Но, конечно, можно было бы представить этот сценарий в графике зависимостей, показывая это имя_ClassName с зависимостью от метода generateClassName () – возможно, показанного с помощью parens, чтобы сделать имя метода легко различимым от имени класса. И, вероятно, было бы неплохо создать соглашение, в соответствии с которым любой метод, который генерирует имя класса динамически, должен содержать аннотацию (в связанном комментарии), которая указывает каждое имя класса, которое может быть сгенерировано, – эти «документированные динамические зависимости», затем может автоматически включаться в граф зависимостей.
На самом деле это не то, на что предназначен PHP_CodeSniffer; особенно потому, что нюансы не должны выводить данные или записывать их в файлы. Но, конечно же, вам ничего не мешает делать это в обнюхивании. Это всего лишь PHP-код, и ему не нужно сообщать о каких-либо ошибках или предупреждениях.
Я не сталкивался ни с какими-то нюхами, которые делают что-то вроде того, что вы описываете, поэтому я думаю, вам придется написать новый.
Если вы хотите создать новый нюх, я бы рекомендовал начать с абстрактного абзаца. Это позволяет вам искать токены T_NEW и T_DOUBLE_COLON внутри токенов T_CLASS. Вот пример.
Или, если вы также хотите посмотреть на глобальные функции и другие внешние классы кода, вы можете просто искать токены T_NEW и T_DOUBLE_COLON внутри обычного нюха
Если вы не знаете, как начать работу, или вам просто нужна помощь в написании нюха, свяжитесь со мной, и я могу помочь написать это с вами. Мне просто нужно знать, какой результат вы хотите получить для каждого найденного случая, или я могу просто использовать что-то основное. Если вам нужна рука, мой адрес электронной почты: gsherwood at squiz dot net
Я написал для этого инструмент: PhpDependencyAnalysis.
Это расширенный статический анализ кода для объектно-ориентированных PHP-проектов (> = 5.3.3) на основе пространств имен. Он создает графики зависимостей на настраиваемых уровнях, например, на уровне пакетов или на уровне класса. Таким образом, можно объявлять зависимости в целом, но также можно выполнять обнаружение нарушений между уровнями в многоуровневой архитектуре в соответствии с соблюдением принципа разделения проблем, закона деметры и принципа ациклических зависимостей. Вы также можете изменить формат вывода на DOT.
Просто проверьте PhpDependencyAnalysis на GitHub .