Как изучить/разобраться в чужом PHP коде?

Потенциальный заказчик просит помочь, дал доступ к исходному коду проекта и БД. Проект написан на самописном фреймворке, с наскоку и внимательного чтения файлов не получается понять как он устроен. Вопрос – какие нужно использовать средства для изучения и понятия работы чужого кода. Возможно есть какой то софт показывающий диаграммы функций/классов? Цепочки вызова функций при исполнении? Как правильно подходить к такого рода задачам? Как называются такие утилиты? Какие есть методики?
  • Вопрос задан
  • 6898 просмотров
Пригласить эксперта
Ответы на вопрос 4
@m-haritonov
По методике:
Я начинаю изучение фреймворков с точки входа (скрипта, который вызывается при получении HTTP запроса, в случае веб фреймворка). Смотрю на возможные пути дальнейшего выполнения кода в этом входном скрипте. Затем изучаю каждый из путей выполнения, доходя до точки завершения работы этого пути (т.е. изучаю от входа к выходу, сверху вниз). Пытаюсь понять предназначение каждого из путей и участков кода, которые на этом пути встречаются. В итоге пытаюсь понять как данный фреймворк вписывается в известную мне модель работы веб технологий (HTTP и т.п.), какая часть фреймворка предназначена для устранения дублирования кода и т.п.

По софту:
Для статического анализа кода поищите по запросам «php reengineering», «php reverse engineering». Обратный инжинеринг PHP кода есть, например, в Enterprise Architect: www.sparxsystems.com.au/platforms/php_uml.html

Для динамического анализа кода можете с помощью xdebug сделать профилирование вызова и на основе полученного файла построить граф с помощью специальной программы (например, KCacheGrind). Подробнее здесь: xdebug.org/docs/profiler

Ещё ссылки на некоторые инструменты: stackoverflow.com/a/4156265/925775 (мне там приглянулся PHP Call Graph)

P.S.: по софту мог где-то ошибиться, т.к. нет большого опыта в использовании описанных инструментов.
Ответ написан
@rozhik
Средств статистического анализа толковых для PHP просто нет. Да и теоретически не во всех случаях это возможно.

Для похожей задачи на PHP3 г;%:?*коде я сделал следующую поделку:
Используя Tokenizer Залил 2 таблички:
functions: id, className, funcName, fileDef, lineDef
ussage: functionsID, calledFunctionsId
inherit: parentClassName, chieldClassName

После этого с помощью простых SQL мне стало легко искать где и что вызывается.

Поделка решала свою узкую задачу, по этому код её не публиковал. Кому интересно — может сделать толковую.
Ответ написан
Комментировать
CodeByZen
@CodeByZen
php, js, my/mssql, sqlite, html, css, it-consult
В дополнение всего вышесказанного хочу порекомендовать простую, но иногда очень полезную, (повторюсь иногда и для специфических задач!) утилитку Strace.

На маке ее зовут dtruss.

Почитать можно например в этом блоге
Ответ написан
Stdit
@Stdit
Схему вызовов функций и методов классов неплохо делает xhprof. Правда, он предназначен скорее для выявления узких мест, но его графы вызовов очень облегчают понимание механизма работы фреймворка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы