Обращаю ваше внимание на то, что эта запись является архивной. Ей уже больше 4 лет. Это означает, во-первых, то, что мое мнение по поднятым в ней вопросам могло измениться (хотя, конечно, не обязательно), а во-вторых, то, что я не испытываю никакого желания эти вопросы обсуждать, и поэтому комментарии и оценки я отключил.
Рано или поздно любой разработчик приходит к пониманию того, что делать запросы к базе, обработку и вывод в одном файле неудобно. А при работе над проектом нескольких человек — практически невозможно. Как следствие — использование концепции MVC и шаблонизатора, что стало стандартом при более-менее серьезном проекте. Да, использование шаблонизатора необходимо. Вопрос в том, какой шаблонизатор использовать.
Шаблонизаторов написано довольно большее количество. Самые популярные из них — Smarty и XTemplate. Разумеется, каждый из них имеет как свои недостатки, так и достоинства. Вот только зачастую недостатков оказывается больше, чем достоинств. И два основных недостатка — плохое быстродействие и недостаточная гибкость.
Рассмотрим на примере Smarty. Возьмем случай, когда нужно вывести неизвестное число фотографий в несколько рядов, по три фотографии в каждом. На входе у нас, соответственно, массив с данными.
$smarty = new Smarty ();
$smarty->assign ("photos", $photos);
Один из способов реализовать это в шаблоне Smarty выглядит следующим образом:
{if $photos}
<table border="0" align="center" width="100%">
<tr>
{assign var="i" value="0"}
{foreach from=$photos item="v"}
{if $i lt 3}
<td align="center">
<a href="/photo/{$v.id}">
<img src="/preview/{$v.id}" border="0" alt="{$v.title}">
</a> <br />
<a href="/photo/{$v.id}"> {$v.title} </a>
</td>
{assign var="i" value=$i+1}
{else}
</tr>
<tr>
<td align="center">
<a href="/photo/{$v.id}">
<img src="/preview/{$v.id}" border="0" alt="{$v.title}">
</a> <br />
<a href="/photo/{$v.id}"> {$v.title} </a>
</td>
{assign var="i" value="1"}
{/if}
{/foreach}
</table>
{/if}
Что и говорить — сложно и не очень красиво. Но это еще не все. Если посмотреть, каким образом Smarty транслировал этот код со своего псевдоязыка на PHP, мы увидим следующее:
<?php if ($this->_tpl_vars['photos']): ?>
<table border="0" align="center" width="100%">
<tr>
<?php echo smarty_function_assign
(array('var' => 'i','value' => '0'), $this);?>
<?php if (count($_from = (array)$this->_tpl_vars['photos'])):
foreach ($_from as $this->_tpl_vars['v']):
?>
<?php if ($this->_tpl_vars['i'] < 3): ?>
<td align="center">
<a href="/photo/
<?php echo $this->_tpl_vars['v']['id']; ?>
">
<img src="/preview/
<?php echo $this->_tpl_vars['v']['id']; ?>
" border="0" alt="<?php echo $this->_tpl_vars['v']['title']; ?>
">
</a> <br />
<a href="/photo/
<?php echo $this->_tpl_vars['v']['id']; ?>
"> <?php echo $this->_tpl_vars['v']['title']; ?>
</a>
</td>
<?php echo smarty_function_assign
(array('var' => 'i',
'value' => $this->_tpl_vars['i']+1), $this);?>
<?php else: ?>
</tr>
<tr>
<td align="center">
<a href="/photo/
<?php echo $this->_tpl_vars['v']['id']; ?>
">
<img src="/preview/
<?php echo $this->_tpl_vars['v']['id']; ?>
" border="0" alt="<?php echo $this->_tpl_vars['v']['title']; ?>
">
</a> <br />
<a href="/photo/
<?php echo $this->_tpl_vars['v']['id']; ?>
"> <?php echo $this->_tpl_vars['v']['title']; ?>
</a>
</td>
<?php echo smarty_function_assign
(array('var' => 'i',
'value' => '1'), $this);?>
<?php endif; ?>
<?php endforeach; unset($_from); endif; ?>
</table>
Каждый, кто знаком с основами оптимизации, может себе представить, насколько это тормозит генерацию страницы. Кроме того, возникает один большой вопрос — зачем писать код на псевдоязыке, который потом (с большими затратами ресурсов) все равно транслируется в код на PHP? Причем транслируется криво и неоптимизированно. Среди любителей Assembler'а есть поговорка — лучшим компилятором является человек. В данном случае это очень даже справедливо.
Из этого всего можно сделать простой вывод — хваленый Smarty на самом деле неповоротливый тормоз. Остальные шаблонизаторы не лучше, а в основном даже хуже — принцип у них одинаковый, а реализация все же у Smarty на высоком уровне.
Во второй части статьи «О шаблонизаторах» будет рассказано об альтернативном варианте для разработки в духе концепции MVC, существенно менее ресурсоемком и намного более быстродействующем.