Умер человек. Но что тут особенного? Ежеминутно умирают тысячи людей. Так свидетельствует статистика. В этом тоже нет ничего особенного. Но для того, кто умирал, его смерть была самым важным, более важным, чем весь земной шар, который неизменно продолжал вращаться.
Эрих Мария Ремарк, «Триумфальная арка».
Обращаю ваше внимание на то, что эта запись является архивной. Ей уже больше 4 лет. Это означает, во-первых, то, что мое мнение по поднятым в ней вопросам могло измениться (хотя, конечно, не обязательно), а во-вторых, то, что я не испытываю никакого желания эти вопросы обсуждать, и поэтому комментарии и оценки я отключил.
В первой части статьи «О шаблонизаторах» мы убедились в том, что использование большинства популярных шаблонизаторов значительно ухудшает быстродействие; кроме того не дает достаточной гибкости даже для не очень сложных случаев. Что же тогда использовать?
Ответ на этот вопрос — нативные шаблоны. Это шаблоны в духе все той же концепции MVC, но не использующие никаких псевдоязыков и не транслирующие код назад на PHP. Потому что шаблон пишется сразу на PHP, и задачей шаблонизатора остается только собрать все переменные и подключить шаблон. Весить такой шаблонизатор будет буквально пару килобайт, а работать будет в 2-3 раза (!) быстрее того же Smarty.
Я, лично для себя, написал такой шаблонизатор. Он называется STemp, и именно он используется в моих разработках. Я, конечно, не буду утверждать, что этот шаблонизатор уникален и неповторим — напротив, я уверен, что многие разработчики создавали для себя аналогичные вещи. Для ознакомления (и использования) вы можете скачать STemp, здесь же я приведу пример его использования. Задачу возьмем ту же самую, на которой мы рассматривали недостатки Smarty — нужно вывести неизвестное число фотографий в несколько рядов, по три фотографии в каждом. На входе — массив с данными.
$stemp = new STemp ();
$stemp->assign ("photos", $photos);
Как видно из примера, инициализация шаблонизатора и передача переменных в шаблон ничем не отличаются от Smarty. В шаблоне же будет следующий код:
<?if ($this->photos):?>
<table border="0" align="center" width="100%">
<?for ($j = 0; $j < count ($this->photos); $j+=3):?>
<tr>
<?for ($i = j; $i < j + 3; $i++):?>
<td align="center">
<a href="/photo/<?=$this->photos[$i]['id']?>">
<img src="/preview/<?=$this->photos[$i]['id']?>"
border="0" alt="<?=$this->photos[$i]['title']?>">
</a> <br />
<a href="/photo/<?=$this->photos[$i]['id']?>">
<?=$this->photos[$i]['title']?> </a>
</td>
<?endfor?>
</tr>
<?endfor?>
</table>
<?endif?>
Получилось проще и удобнее, чем на Smarty. А для верстальщика, не знающего PHP, этот код, на мой взгляд, даже понятней чем код шаблона Smarty (это к тому, что поклонники Smarty утверждают, что их шаблоны гораздо проще для восприятия, чем нативные шаблоны. Как говорится, почувствуйте разницу — что понятнее — два цикла, не засоряющие html-код или какие-то {if $i lt 3} и {assign var="i" value=$i+1}). Что касается быстродействия - то оно улучшится в обещаные 2-3 раза, можете проверить.
Это, в принципе, все, что я хотел рассказать. Этой статьей я не преследую цель агитировать всех разработчиков использовать нативные шаблоны. Я всего лишь показываю разницу между этими подходами. Если после всего сказанного вы продолжаете считать, что Smarty лучше (удобнее, понятнее, быстрее :-) нативных шаблонов — используйте на здоровье. Но в таком случае я бы посоветовал вам задуматься о собственной профпригодности.
Также, если вас заинтересовала данная тема, предлагаю ознакомиться со следующими ссылками:
О шаблонных механизмах на форуме «ПЫХА.РУ»
Прощай Smarty, или простой шаблонизатор в блоге «LARIN.in»
Шаблоны в PHP для чайников на «Spectator.ru»
siger, 7-го октября 2008 года в 16:48
Вообще-то, прежде чем писать подобные статьи, неплохо было бы разобраться в предметной области...
Что такое Smarty
- Smarty - это компилирующий обработчик шаблонов.
- Шаблоны компилируются только один раз.
- Перекомпилируются только те шаблоны, которые изменились.
Smarty не транслирует PHP код, он его компилит(!!!)
Для управления компиляцией в классе Smarty есть такие переменные: $force_compile
Вывод: RTFM!
siger, 7-го октября 2008 года в 22:39
Одна из уникальных возможностей Smarty - компилирование шаблонов. Это означает, что Smarty читает файлы шаблонов и создает PHP-код на их основе. Код создаётся один раз и потом только выполняется. Поэтому нет необходимости в медленной обработке файл шаблона для каждого запроса. Каждый шаблон может пользоваться всеми преимуществами таких компиляторов PHP и кэшируюших решений, как eAccelerator, ionCube, mmCache, Zend Accelerator и прочих.
sap, 7-го октября 2008 года в 23:11
Да, шаблоны компилируются, я знаю. А вы когда-нибудь смотрели откомпилированный код? Видели насколько он неоптимизирован и полон излишеств?
siger, 8-го октября 2008 года в 15:06
Если сравнивать код вашего шаблона (с использованием вашего шаблонизатора) и скомпилированого шаблона Smarty, то разница в основном вот такая:
- в вашем шаблоне:
<?=$this->photos[$i]['id']?>
- в шаблоне Smarty:
<?php echo $this->_tpl_vars['v']['id']; ?>
По-моему, это не критично...
sap, 8-го октября 2008 года в 15:58
Посмотрите в первой части, там приведен код откомпилированного шаблона для данного случая.