Эта система была названа FreeEnergy, так как она аналогична высвобождению энергии средой, которую создает PHP. Функция include в PHP является достаточно уникальной и основной для проекта FreeEnergy, особенно из-за того, что она позволяет задавать сценарий с помощью переменной. Содержимое, уникальное для страницы, называется экраном. Имя экрана передается одному сценарию PHP, который просматривает имена экранов в большом массиве, задающем соответствие экрана определенным модулям размещения и навигации.
Система FreeEnergy разбивает Web-страницы на пять модулей: действия, планировки, навигации, экрана и утилит. Модули действия выполняют определенные функции записи в базу данных, файл или, возможно, в сеть. Только одни модули действия выполняются до выполнения модуля экрана. Модуль действия может перекрывать модуль экрана, указанный в запросе. Это уместно тогда, когда модуль действия делает попытку обработать форму, данные которой являются неполными или неудовлетворительными каким-либо другим образом. Модули действия никогда не отсылают данные непосредственно на экран, вместо этого они добавляют сообщения в стек, из которого они будут обработаны позднее модулем планировки. Возможно, что модуль действия отправит информацию заголовка, поэтому очень важно, чтобы никакого вывода не было.
Модули планировки содержат код, предназначенный для управления выводом модулей экрана и навигации, и обычно содержат теги table для управления планировкой Web-страницы. В ячейках таблицы размещаются вызовы функции include, которые могут вызывать модули навигации или экранные модули.
Модули навигации содержат ссылки и повторяющиеся элементы. На жаргоне, ис­пользуемом инженерами, с которыми мне пришлось поработать, это "top nav", "bottom nav" и "side nav". Рассмотрим в этой связи популярный Web-узел "Yahoo!". Его страницы содержат унифицированные навигационные средства вверху и внизу экрана. Его верхние средства навигации содержат эмблему и ссылки на важные области Web-узла. Если бы Web-узел "Yahoo!" был закодирован в стиле FreeEnergy, то, вероятно, был бы предусмотрен динамический модуль навигации для генерации ссылок на текущую секцию наподобие "Home > Computers and Internet > Software > Internet > World Wide Web > Servers > Server Side Scripting > PHP".
Экранные модули содержат уникальное содержимое для каждой отображаемой страницы. По контексту это может быть простой HTML- или PHP-код. Пресс-релиз является примером статического содержимого. Его можно подготовить, не зная PHP. Но нужно только знать о том, что экранный модуль является фрагментом HTML-кода.
Модули могут опираться в своей работе на модуль утилит, в котором файлы утилит используются в различных контекстах. Некоторые модули утилит вызываются при загрузке каждой страницы. Другие являются набором функций или объектов, имеющих отношение к определенной базе данных.
Все модули хранятся в каталоге modules, который содержит подкаталог для каждого типа модулей. Для увеличения безопасности он размещается вне каталога документов Web-сервера. В каталоге документов должен храниться только один-единственный PHP-сценарий index.php, который начинает процесс вызова последовательности модулей и структурирования их вывода с помощью обычных тегов HTML. 
27.6. Шаблоны
В качестве другого метода разбиения PHP-приложений на модули можно назвать применение шаблонов. Наличие слабых связей является фундаментальным принципом хорошего проекта системы. Кроме того, что это не будет обескураживающим фактором для людей, не знающих PHP. Разделение позволяет выиграть от переключения на различные языки представления, такие как XML, не затрагивая при этом логику программы.
Используя шаблоны, разработчики интерфейса вставляют простейшие теги в файлы-прототипы (шаблоны), состоящие в основном из HTML-кода. Они вставляют короткие фрагменты простого языка описания шаблона, который анализирует PHP-сценарий для того, чтобы заменить маркеры сгенерированной информацией.
Как и большинство других решений, это решение имеет свои недостатки. Работа с шаблонами приводит к большей нагрузке на PHP при загрузке страниц. PHP включает эффективный синтаксический анализатор, написанный на языке C гениями из компании Zend. Создавая собственный синтаксический анализатор с помощью PHP, разработчики обречены на создание менее оптимального анализатора. Однако простой синтаксис позволит ускорить процедуру анализа, а использование кэширования - избежать усложнения процедуры.
Я оптимистически оцениваю перспективы изучения программирования на PHP среднестатистическим человеком. Использование шаблонов основано на пессимистической оценке, что среднестатистический человек не сможет освоить PHP, но в целом может понять различие между PHP и HTML. Но это также является почвой для создания хорошего инструментария.
Вероятно, наиболее старой из имеющихся шаблонных систем является FastTemplate. Она берет начало из реализации аналогичной системы на языке Perl. Для хранения шаблонов в этой системе используются файлы .tpl. Эти шаблоны содержат HTML-код и маркеры, взятые в фигурные скобки. Сценарий PHP загружает шаблон, задает значения для каждого маркера и анализирует шаблон для создания окончательного фрагмента HTML-кода, готового для обработки браузером.

| Листинг 27.3. Главный шаблон_
<html>
<head><title>{TITLE}</title>
</head>
<body>
<h1>{TITLE}</h1>
<table>
<tr>
<td valign="top">{SIDENAV}</td>
<td valign="top">{MAIN}</td>
</tr>
</table>
</body>
</html>