Иногда бывает полезно узнать последовательность вызовов функций (методов) во время исполнения какого-либо скрипта.
Простейший способ сделать это, который мне попался под руку – это воспользоваться встроенным функционалом популярного бесплатного отладчика 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);