Понимание большого PHP-кода, какие методы использовать? - PullRequest
9 голосов
/ 07 апреля 2011

Мне передали большой недокументированный код приложения, написанного на php, так как оригинальный кодер перешел на AWOL. Моя задача - добавить новые функции, но я не могу этого сделать без понимания кода. Я начал возиться. честно говоря, я поражен количеством исходного кода. Я нашел:

  • Хорошо написано на основе архитектуры MVC, постоянства БД, шаблонов и ООП
  • модульная, есть концепция маршрутизации на основе URL, базовые шаблоны
  • Использует пользовательский PHP-фреймворк, в котором нет документации. И нет истории управления исходным кодом (упс!)
  • там более 500 файлов, каждый из которых содержит сотни строк кода. И у каждого файла есть 3-4 оператора require_once, которые включают в себя тонны других файлов, поэтому трудно сказать, какая функция / класс / метод происходит откуда

Теперь я ищу некоторые методы, которые я использую, чтобы понять этот код. например, рассмотрим следующий фрагмент кода:

class SiteController extends Common {

private $shared;
private $view;


protected function init(){


    $this->loadShared();
    $this->loadView();


}

private function loadShared(){
    $this->shared = new Home();
}

private function loadView(){
    $this->view = new HomeView();
}

Я хочу знать

  • где HomeView () & Home () определены? Откуда $ this-> shared & this-> view ? Я проверил остальную часть файла, нет метода с именем shared или view. очевидно, что они происходят из одного из сотен классов, включаемых с помощью require_once (). Но какой именно? как я могу узнать?
  • Могу ли я получить список всех выполняемых функций или методов? Если да, то как?
  • этот класс SiteController переопределяет базовый общий класс. Но я не смог выяснить, где находится этот класс Common . Как сказать?

Далее, пожалуйста, поделитесь некоторыми приемами, которые используются для понимания существующего кода, написанного на php?

Ответы [ 8 ]

9 голосов
/ 07 апреля 2011

Во-первых, в такой ситуации я пытаюсь получить обзор приложения : какая-то глобальная идея:

  • Что приложение (не код!) делает
  • Как глобально организован код: где модели, шаблоны, контроллеры, ...
  • Как структурирован каждый тип компонента - как только вы узнаете, как работает класс Model, другие, как правило, будут работать так же.


Если у вас есть эта глобальная идея, вы можете начать понимать, как работает код, если у вас есть время до этого, - использовать PHP Debugger.
Об этом Xdebug + Eclipse PDT возможен, но почти все современные IDE поддерживают это.

Это позволит вам шаг за шагом генерировать страницу за строкой, понимая, что называется, когда, откуда, ...

Конечно, вы не будете делать это для всего приложения!
Но так как ваше приложение использует Framework, высока вероятность того, что все части приложения будут работать одинаково - это означает, что истинное понимание одного компонента должно облегчить понимание другого.


Как пара инструментов, чтобы понять, что называет, что и как и где, вы можете взглянуть на:

  • , включая расширение (цитирование) : Позволяет отслеживать и выводить иерархию включений файлов и наследования классов во время выполнения
  • Xdebug + KCacheGrind позволит вам генерировать графы вызовов; XHProf должны делать то же самое.
  • Использование вашей IDE ( Eclipse PDT , Zend Studio , phpStorm , netbeans , ...) , Ctrl + клик по классу / методу должен привести вас к его объявлению.


Также обратите внимание, что приложение - это не только код : часто бывает очень полезно пересоздать базу данных, чтобы сгенерировать диаграмму всех таблиц.

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

2 голосов
/ 07 апреля 2011

grep это единственное, что заставляет меня выживать при таком коде

2 голосов
/ 07 апреля 2011

Вам нужна IDE. Я использую NetBeans для PHP, и он прекрасно работает. Это позволит вам узнать, где находятся домашние / домашние классы, щелкнув правой кнопкой мыши и выбрав опцию «найти, где определено» или что-то подобное.

Вы можете получить список. Это называется стеком. Настройка отладчика, такого как xdebug, с помощью IDE позволит вам сделать это.

1 голос
/ 28 марта 2012

1) Вы можете использовать инструмент поиска, такой как grep, чтобы найти код, включая определения.Но на большой базе кода grep работает медленно и дает много ложных срабатываний, потому что не понимает язык PHP.

Наша Поисковая система является инструментом на основе графического интерфейсакоторый индексирует ваш исходный код для достижения чрезвычайно быстрого поиска, индексируя по элементам языка (именам переменных, константам, ключевым словам, строкам, ...) и позволяя формулировать запросы, которые соответствуют структуре языка (например, он игнорирует пробелы и комментарии, если вы не скажететы хочешь их увидеть).Запрос отображает попадания в окне попадания, и щелчок приводит вас к файлу / строке, в которой происходит попадание.С помощью небольшого количества дополнительной конфигурации вы можете перейти из окна кода в ваш любимый редактор.

2) Иногда вы хотите знать, где существует конкретная функциональность, но не знаете, что искать.Здесь может помочь инструмент покрытия тестов.Простая настройка тестового покрытия для (рабочего) приложения и выполнение функций вручную;то, что «покрыто», это потенциально код, который вас волнует.Тренируйте что-то, что НЕ является особенностью;то, что покрыто, НЕ является кодом, который вы хотите.Это намного проще, чем пытаться запустить отладчик, чтобы найти интересующий код.Наш PHP Test Coverage может предоставить вам это покрытие, и не только показать вам покрытый код в графическом интерфейсе, но и сделать это «вычитание покрытия», чтобы вы могли видеть только соответствующий код.

1 голос
/ 07 апреля 2011

Начните с точки входа приложения (обычно index.php) и углубитесь в то, что вызывается, когда.

Испытайте PHPstorm, это идеал с отличными возможностями анализа кода, он может перейти к определению любого класса и переменной, показать иерархию наследования, найти использование и многие другие полезные вещи.

Я также подключу свой собственный инструмент:

http://raveren.github.io/kint/

Это работает с настройкой нуля и чрезвычайно полезно, чтобы понять, что и где происходит. Используйте Kint::trace();, чтобы увидеть красивую трассировку выполнения, и d(get_defined_vars());, чтобы увидеть, что определено в текущем контексте, и в конечном итоге вы получите это.

Скриншот:

Kint screenshot

1 голос
/ 07 апреля 2011

Кажется, вы понимаете, что не можете читать / переваривать каждый файл, поэтому вам нужно сосредоточиться на важных. Похоже, вы начали этот процесс с SiteController.

Надеюсь, что между прочтением требований и использованием вашей IDE вы можете отследить Home() и HomeView()

Там может быть несколько ключевых XML-файлов, которые определяют сопоставление URL-адресов с файлами контроллеров, поэтому вам нужно выяснить, как они работают.

Раньше я работал с плохо документированной (но прилично работающей) пользовательской платформой, и ваша ситуация кажется довольно схожей. Я понял, что все довольно гладко, когда я понял основной контроллер и в основном сформировал понимание того, как обрабатываются запросы URL.

1 голос
/ 07 апреля 2011

Я бы начал с:

  • , выбрасывающего исключение в определенных точках, чтобы увидеть трассировку стека, где произошел вызов.
  • grep для Class Common, например
  • создайте список каталогов, чтобы получить представление об организации программного обеспечения
  • используйте get_included_files();, чтобы увидеть, что на самом деле используется для определенного вызова
  • Начните документировать то, что я узнаю
  • Начните работать с IDE, например, NetBeans, Eclipse или Zend Studio
  • Изучите иерархии классов с помощью, возможно, этого "php: определение иерархии классов объекта во время выполнения" подхода
1 голос
/ 07 апреля 2011
  • Загляните внутрь скрипта, где вы нашли этот фрагмент кода, чтобы найти дополнительные включенные или обязательные страницы, которые PHP импортировал в основной скрипт. Эти сценарии должны определять те классы, для которых создается экземпляр.
  • Извините, не уверен, сможете ли вы найти, какие функции / методы были выполнены. Я знаю, что вы можете найти, если они существуют, и вы можете найти сгенерированный результат их ... но не уверен, что они были выполнены.
  • Важно отметить, что SiteController не переопределяет класс Common , но расширяет его или строит поверх него, например, как здание построено на Фонд. Класс Common является основой. Снова, проверьте включенные и обязательные сценарии, чтобы увидеть, где Common был определен.

Надеюсь, это поможет,
spryno724

...