我仍在努力证明模板系统的合理性.为什么我不应该只发出html


I am still struggling with justifying template systems. Why should I not just emit html?

我真的看不出它们之间的区别。模板的效果如何?我不仅不明白它,也不明白我如何说服别人使用它。我理解担忧的"分离",但我没有遇到过大问题。第一个生成多个<li>标签的例子不是和echo一样吗?而且,我会使用php作为"模板语言",所以我不关心Smarty或其他系统。谢谢

为什么我应该在PHP中使用模板系统?

<h1><?=$title?></h1>
<ul>
  <?php foreach ($items as $item) {?>
  <li><?=$item?></li>
  <?php } ?>
</ul>

和(我在论坛上找到的一些片段作为例子):

echo "<table>";
for ($i = 0; $i < $largestArray; $i++)
{
        echo "<tr>";
        if ($i < $array1Size)
        {
                echo "<td>";
                echo $array1[$i];
                echo "</td>";           
        }
        else
        {
                echo "<td>";
                echo "null";
                echo "</td>";           
        }
        if ($i < $array2Size)
        {
                echo "<td>";
                echo $array2[$i];
                echo "</td>";           
        }
        else
        {
                echo "<td>";
                echo "null";
                echo "</td>";           
        }
        echo "</tr>";
}
echo "</table>";

或者类似的东西:

<table id="working" border="0" cellspacing="1" cellpadding="3">
    <tr>
        <?php foreach ($csv->titles as $value): ?>
            <td><?php echo $value; ?></td>
        <?php endforeach; ?>
    </tr>
    <?php foreach ($csv->data as $key => $row): ?>
        <tr>
            <?php foreach ($row as $value): ?>
                <td><?php echo $value; ?></td>
            <?php endforeach; ?>
        </tr>
    <?php endforeach; ?>
</table>

编辑:这应该是一个社区维基问题吗?

您的标识似乎有点混乱,但最重要的是第二个版本的可读性要高得多(例如,您可以轻松读取标记层次结构)。可读代码是指可以很容易地维护或重构的代码。

只使用PHP的echo关键字编写下面的代码不太可读。你也会担心引号和双引号。使用类似模板的方法,您最终得到的代码看起来类似于HTML文档。

<table id="working" border="0" cellspacing="1" cellpadding="3">
    <tr>
        <?php foreach ($csv->titles as $value): ?>
            <td><?php echo $value; ?></td>
        <?php endforeach; ?>
    </tr>
    <?php foreach ($csv->data as $key => $row): ?>
        <tr>
            <?php foreach ($row as $value): ?>
                <td><?php echo $value; ?></td>
            <?php endforeach; ?>
        </tr>
    <?php endforeach; ?>
</table>

cakepp和codeignator等模板化系统使用MVC,使代码更干净、更符合标准。您也可以编写自己的MVC。

模板系统是而不是表示逻辑分离的最终解决方案。它们是一个解决方案,也是许多PHP框架使用的解决方案。在一般的"MVC"/MVA/MMVM/MVVM PHP开发中,您不希望在表示层中有任何业务逻辑。回显HTML(通常)直接违反了这种做法;对于模板,业务逻辑不存在于表示层中,反之亦然。

跳回到第一点,模板是解决方案,而不是方案。表示层有很多可用的选项,这在很大程度上取决于您的编码风格和/或框架/库的使用情况。

在个人层面上,我更喜欢模板(对于大多数小型医学项目),原因除了上面概述的之外:

  1. 使"主题化"和交换网站样式变得更加容易。只需修改模板或实现一个主题切换器,即可加载不同的模板

  2. 从实体模型到模板是一件轻而易举的事,因为模板(通常)只是HTML,其中有一些php片段会回显数据。

  3. 模板是"愚蠢的"。它们不需要知道业务逻辑中发生的任何事情,它们所关心的只是将一些数据回显到HTML中。

  4. 可读性。这几乎完全是个人偏好,尤其是考虑到模板语法的广泛性。

tl;dr-模板化与[在此插入其他解决方案]几乎完全是主观的,除非你有基于托管、客户要求、流量水平等的限制。如果是这样,那么就找到关于效率和可扩展性的基准和更多信息,并根据项目的要求做出明智的决定。