Иногда бывает полезно узнать последовательность вызовов функций (методов) во время исполнения какого-либо скрипта.
Простейший способ сделать это, который мне попался под руку – это воспользоваться встроенным функционалом популярного бесплатного отладчика PHP – XDebug.
Для примера рассмотрим последовательность вызовов методов ядра Joomla реализующих такую простую вещь как вывод на экран страницы со статьей.
Подробная документация по выводу последовательности вывода вызовов с помощью XDebug расположена на официальном сайте отладчика по адресу http://xdebug.org/docs/stack_trace.
Воспользуемся двумя функциями для вывода колл-стека: xdebug_get_function_stack () (возвращает массив стека вызовов до этого пункта) и xdebug_print_function_stack () (показывает текущий стек вызова функций, подобным внешне способу показа XDebug ошибочных ситуаций).
Так как конечной точкой в процессе формирования статьи является шаблон вида вывода вставим функции в него C:\webserver\www\joomla\templates\joomla\html\com_content\article\default.php, например, перед выводом основного текста статьи:
<div class="article-content"> // ... <?php if (isset ($this->article->toc)) : ?> <?php echo $this->article->toc; ?> <?php endif; ?> <?php xdebug_print_function_stack( '' ); ?> <!--<?php var_dump(xdebug_get_function_stack()); ?>--> <?php echo $this->article->text; ?> // ... </div>
| ( ! ) Xdebug: user triggered in C:\webserver\www\joomla\templates\joomla\html\com_content\article\default.php on line 132 | ||||
|---|---|---|---|---|
| Call Stack | ||||
| # | Time | Memory | Function | Location |
| 1 | 0.0022 | 88824 | {main}( ) | ...\index.php:0 |
| 2 | 0.5346 | 5736336 | JSite->dispatch ( ) | ...\index.php:68 |
| 3 | 0.5671 | 5969256 | JComponentHelper->renderComponent ( ) | ...\application.php:124 |
| 4 | 0.5841 | 6070064 | require_once ( 'C:\webserver\www\joomla\components\com_content\content.php' ) | ...\helper.php:162 |
| 5 | 0.5994 | 6441928 | JController->execute ( ) | ...\content.php:35 |
| 6 | 0.5994 | 6442632 | ContentController->display ( ) | ...\controller.php:236 |
| 7 | 0.6117 | 6733256 | JController->display ( ) | ...\controller.php:49 |
| 8 | 0.6499 | 7224624 | JCacheView->get ( ) | ...\controller.php:312 |
| 9 | 0.6504 | 7268904 | ContentViewArticle->display ( ) | ...\view.php:98 |
| 10 | 1.0164 | 9752408 | JView->display ( ) | ...\view.html.php:196 |
| 11 | 1.0164 | 9752408 | JView->loadTemplate ( ) | ...\view.php:195 |
| 12 | 1.0222 | 9901592 | include ( 'C:\webserver\www\joomla\templates\joomla\html\com_content\article\default.php' ) | ...\view.php:567 |
| 13 | 1.0326 | 9930440 | xdebug_print_function_stack ( ) |
...\default.php:132 |
Которая описывает последовательность вызова функций и методов Joomla от корневого файла index.php до конечного default.php задействованных в выводе статьи.
Если воспользоваться функцией xdebug_get_function_stack () можно также заметить название объекта ContentViewArticle (ContentViewArticle object) (котрый по сути и является объектом данных статьи. Данные именно этого объекта используются в шаблоне например для вывода дат: <?php echo JHTML::_ ('date', $this->article->created, JText::_ ('DATE_FORMAT_LC3')); ?>) и предположить последовательность его создания:
- ...\components\com_content\controller.php: parent::display (true);
- ...\libraries\joomla\application\component\controller.php: $view = & $this->getView ( $viewName, $viewType, '', array ( 'base_path'=>$this->_basePath));
- ...\libraries\joomla\application\component\controller.php: $view = & $this->_createView ( $name, $prefix, $type, $config )
- ...\libraries\joomla\application\component\controller.php: $result = new $viewClass ($config);