Личный сайт Андрея Сабинина

Сайт не обновляется с начала 2011 года, так как у меня на это нет ни времени, ни желания.

Заглавная / Архив блога о разработке / Разработка / О шаблонизаторах. Часть первая
 

О шаблонизаторах. Часть первая

sap, 16-го апреля 2008 года в 01:46

Обращаю ваше внимание на то, что эта запись является архивной. Ей уже больше 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, существенно менее ресурсоемком и намного более быстродействующем.

 −2
+8