为啥我应该在 PHP 中使用模板系统? [关闭]

Posted

技术标签:

【中文标题】为啥我应该在 PHP 中使用模板系统? [关闭]【英文标题】:Why should I use templating system in PHP? [closed]为什么我应该在 PHP 中使用模板系统? [关闭] 【发布时间】:2010-09-30 23:07:59 【问题描述】:

为什么要在 php 中使用模板系统?

我的问题背后的原因是:PHP本身是功能丰富的模板系统,我为什么要安装另一个模板引擎?

到目前为止,我发现的唯一两个优点是:

    更简洁的语法(有时) 模板引擎通常不足以实现业务逻辑,因此它迫使您分离关注点。使用 PHP 进行模板可以引诱您绕过模板原则并重新开始编写代码汤。

...与缺点相比,两者都可以忽略不计。

小例子:

PHP

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

聪明

<h1>$title</h1>
<ul>
  foreach item=item from=$items
  <li>$item</li>
  /foreach
</ul>

我真的看不出有什么不同。

【问题讨论】:

感谢您的每一条评论。它帮助我理清思路。现在我使用 Zend Framework,并且会向所有人推荐相同的方法。现在,我将 Smarty 等视为通向更复杂、更高效、更具挑战性和更有趣的框架开发世界的一步。没有更多的 mysql_queries 和 include_onces :-) 一方面,您使用的是 php 短标签,我同意这会使事情变得更好,但您会因此而被 PHP 社区排斥。比较 &lt;?php echo $foo ?&gt;$foo 以获得公平的比较,然后 smarty 在可读性方面明显胜出。 @DGM 你会因此而被 PHP 社区排斥 - 首先,我严重怀疑这个帐户(许多著名的开发者都提倡短标签)。第二,... [可怕的学术] PHP 社区?我们不是一群喜欢在沙盒里玩耍的有趣的、喜欢污垢的赤脚孩子吗?:) 免责声明:我花了 6 到 8 年时间研究 PHP,而忽略了真正美丽而强大的编程语言,现在我 32 岁了,真的很后悔!违反 PEP8 - 这就是你会被排斥的地方,这真的很重要。 PS。我敢于假设 PHP 一开始的实际目的是模板系统。没有? 正如@Kornel 指出的here,使用模板引擎可能还有其他原因,而不是更简洁的语法。 Latte 例如具有非常强大的自动转义,几乎不可能手动正确实现。 【参考方案1】:

是的,正如您所说,如果您不强迫自己在 PHP(模板引擎)中使用模板引擎,那么很容易滑倒并停止分离关注点。

然而,在分离关注点时遇到问题的人最终会生成 html 并将其提供给 smarty,或者在 Smarty 中执行 PHP 代码,因此 Smarty 几乎无法解决您的关注点分离问题。

另见:

PHP as a template language or some other templating script What is the best way to insert HTML via PHP

【讨论】:

是的,这正是我们使用 Smarty 时遇到的问题。将 html 代码提供给 smarty 变量并使用 php/php 标签。 @sanchothefat:我认为模板语言都很糟糕,并且在任何实现中都不会完全分开,您只需要在逐个项目的基础上画出自己的界限。我正在努力在我的模板中添加 no 代码,但那还有一段路要走。 显示逻辑总是一个滑坡。斑马条纹或文本格式在什么时候成为“真正的”逻辑?我的观点是,如果你问自己这个问题,而不仅仅是说“去他妈的”,那么你就走在了正确的道路上。 这是您将使用 smarty 编写的可维护代码...说真的...我检查了责备,类似上周写的内容...::: foreach from=$array| @array_keys item='key' foreach from=$array|@array_values item='value'if $smarty.post.var==$key$value|escape:'html'else $key|escape:'html'/if/foreach/foreach 第一个链接坏了。【参考方案2】:

人们使用模板系统的主要原因是将逻辑与表示分离。这样做有几个好处。

首先,您可以将模板交给网页设计师,他们可以随意移动内容,而不必担心保持代码的流畅性。他们不需要了解 PHP,只需要知道不要理会特殊标签。他们可能需要为几个标签学习一些简单的语义,但这比学习整个语言要简单得多。

此外,通过将页面拆分为单独的文件,程序员和设计人员可以同时在同一个“页面”上工作,根据需要签入源代码管理,而不会发生冲突。设计师可以针对稳定版本的代码测试他们的模板视觉效果,同时程序员针对他们自己的副本进行其他可能破坏性的更改。但是,如果这些人都在编辑同一个文件并且必须合并不同的更改,那么您可能会遇到问题。

它还强制执行良好的编程实践,使业务逻辑远离表示逻辑。如果您将业务逻辑与演示文稿混合在一起,那么如果您以后需要以不同的方式演示它,那么您将很难提取它。如今,Web 应用程序中的不同呈现模式越来越流行:RSS/ATOM 提要、JSON 或 AJAX 响应、用于手持设备的 WML 等。使用模板系统,这些通常可以完全使用模板完成,而无需或很少更改任何内容否则。

然而,并不是每个人都需要或欣赏这些好处。 PHP 相对于 Java/Python/Ruby/etc 的优势在于您可以快速破解包含一些逻辑的网页,这一切都很好。

【讨论】:

优秀的答案。逻辑和表示的分离是最大的好处。允许更改设计而不用担心代码会大大提高生产力。 当然,这一切都是正确的,但您不需要单独的模板引擎来做到这一点。 PHP 本身可以按照您描述的方式使用。也许是我的措辞不好。我的意思是将模板系统作为产品而不是方法。 在这里使用“现成”软件的好处与其他任何地方一样:您将获得社区事先测试、准备好的文档以及未来几乎免费的维护的好处。 如果你有纪律,你可以在纯 php 中自己实现关注点分离,但是随着项目发展到拥有更多的开发人员,确保你的纪律将成为越来越多的任务也适用于其他开发人员/设计师。【参考方案3】:

以分离逻辑为借口使用非 PHP 模板是无稽之谈。如果开发人员不了解业务视图逻辑分离是什么以及应该如何完成,那么必须适当地解决问题。否则,您最终会在业务逻辑中使用 HTML 或在模板中使用业务逻辑——没有模板引擎可以拯救您。您必须向开发人员传授基础知识。

如果开发人员确实理解这一点,那么模板系统只是一个限制。它不会在开发过程中增加任何价值,只会产生学习新语法、使另一个库保持最新以及执行速度变慢的开销。虽然后者可以通过缓存等解决,但这只能解决一个原本不存在的问题。因此,模板系统没有任何价值,也没有任何优势。

不过,有一个例外,我认为使用非 PHP 模板系统是合理的:当视图逻辑程序员必须对模板具有有限的访问权限时。例如,如果您是博客托管系统的提供商,并且您希望允许您的用户对他们的模板进行个性化和编码,而不允许他们执行任意代码。然而,这个论点适用于设计师愿意学习一些代码来帮助编程 UI 的情况。如果他能学习 Smarty,他肯定会学习 PHP。

【讨论】:

【参考方案4】:

仍然有充分的理由使用模板系统,但不是 Smarty,而是 PHPTAL。 PHPTAL 模板是有效的 XML(因此也是 XHTML)文件。您可以进一步在 PHPTAL 中使用虚拟内容,从而获得具有最终外观的有效 XHTML 文件,可以使用标准工具对其进行处理和测试。这是一个小例子:

<table>
  <thead>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Age</th>
    </tr>
  </thead>
  <tbody>
    <tr tal:repeat="users user">
      <td tal:content="user/first_name">Max</td>
      <td tal:content="user/last_name">Mustermann</td>
      <td tal:content="user/age">29</td>
    </tr>
  </tbody>
</table>

PHPTAL 模板引擎会自动插入 users 数组中的所有值并替换我们的虚拟值。不过,该表已经是可以在您选择的浏览器中显示的有效 XHTML。

【讨论】:

【参考方案5】:

PHP 几乎是一个模板系统。关键是强迫自己将逻辑与表示分开。使用 Smarty 或类似的东西只会使混合逻辑和表示变得稍微不方便。如果您不能自己将它们分开,那么使用模板系统将无济于事。它所要做的就是消耗额外的处理能力。

关键是不要更改演示代码中的任何值。为此,我认为如果使用 if/endif 语法,PHP 本身与 Smarty 一样有效:

<?php if($some_test): ?>
   <em>Some text!</em>
<?php endif; ?>

【讨论】:

确实是转义变量使 php 失败了冗长的游戏,这就是为什么你必须编写非常简洁的包装函数和仅使用 结束块的整体可读性,这会搞砸你。【参考方案6】:

对我来说,模板引擎的一大特点是缓存层对您来说是透明的。我很久以前就一直在使用 smarty,缓存的东西让生活更轻松。聪明的设计也让你可以使用自己的缓存功能。 在我的情况下,我选择对于某些页面是否应该使用 memcache 或磁盘来存储模板输出。

另一方面,如果您的网站流量很大,并且您不知道如何管理和调整它,那么任何模板引擎都可能成为网站杀手。但即使不使用 smarty,您的网站也会死掉。

flickr 目前正在使用 smarty。应该不会太糟糕吧?

【讨论】:

【参考方案7】:

主要是为了避免在模板中应用任何“不安全”的后端逻辑。 由于大多数时候模板是交给设计师的,我们只想给他们一套他们可以做的封闭的事情。

【讨论】:

好的,这将是我的专业人士的第 2 点。你总是可以(至少在 Smarty 中)向模板引擎注入不安全的东西。只是有点难:-) 那就不要使用 Smarty :)【参考方案8】:

我喜欢从任何 PHP 文件中轻松显示任何模板的能力(并在彼​​此之间包含模板片段,用于导航栏等常见元素)。例如,假设您有一个页面,如果您已登录,则该页面通常会打印一些信息,如果您未登录,则会显示错误。使用 PHP,您可以编写如下内容:

if (loggedIn)

    // print lots of HTML here

else

    // print error message

在 Smarty 中,可能是这样的(请原谅我的语法错误,已经有一段时间了):

if (loggedIn)

    $smarty->bind("info", someObject);
    $smarty->display("info.template");

else
    $smarty->display("error.template");

如果您真的很聪明,您甚至可以显示登录页面模板而不是错误模板,还可以选择显示一条消息来解释用户为何会出现在该页面。如果您采用我编写的技术,然后决定切换到显示登录框,则只需更改一行!对我来说,这不仅仅是保持视图和逻辑的分离,还在于能够从许多地方重用视图的公共元素。

【讨论】:

这也可以在 PHP 中使用 include 来完成,但我想 Smarty 可以更轻松地做到这一点。【参考方案9】:

我很高兴使用像代码点火器这样的 MVC 框架。我发现在“视图”中,我倾向于坚持只与值的显示方式相关的 php 代码。我有一个格式化函数库,可以在视图中使用。代码点火器的前提之一是避免使用模板语言,因为它会限制您并导致速度变慢。

我发现对于设计师来说学习一些 PHP 更好,这样他们就可以实现他们需要做的事情,例如。交替类名。从长远来看,这也将使它们更加有用,并且从一种语法到另一种语法并不是一个巨大的飞跃。

【讨论】:

【参考方案10】:

您两次忘记了htmlspecialchars()。这就是您需要模板系统的原因。

Smarty 很穷。不要以此来判断模板系统。

【讨论】:

事后看来,这是整个线程中最好的答案。谢谢!【参考方案11】:

您的分析是合理的。我想:

模板设计师和后端程序员可能不是同一个人,所以它促进了分离。 它在一定程度上保护您免受自己的伤害,因为您不能在模板中真正做“太多”的 PHP。 在某些情况下优化/预编译模板可能更容易? (这是猜测)

就我个人而言,我认为它们比它们的价值更麻烦。特别是如果你想手,它们就不起作用 模板给“设计师”,因为所见即所得的工具不知道如何处理它们。

【讨论】:

【参考方案12】:

我没有看到的一个模板引擎优势是动态 html 元素的可能性——比如 asp.net 控件。例如,使用 PEAR 的 HTML 模板 Flexy,您可以拥有自动维护状态的动态表单元素。可以填充常规的 html 选择元素,并在后面的代码中设置所选项目,而无需在模板中使用循环或条件。

【讨论】:

【参考方案13】:

我认为更简洁的语法是一个很大的胜利。虽然看起来可能只有几个字符,但是当你每天都这样做时,每个字符就开始计数了。

而且$myvar|escape 恕我直言,比&lt;?php echo htmlspecialchars($myvar); ?&gt; 短很多。 (请记住,&lt;?=$foo?&gt; 语法只有在 PHP conf 中特别启用时才可用。)

【讨论】:

好的,但是每次我想用 Smarty 写点东西时,我都会去找 Smarty 备忘单,因此并没有节省太多时间 :-) @JS 一旦你每天开始使用它,你就不需要看工作表了 在使用了一年后我仍然需要备忘单,因为我遇到了一些荒谬的案例,它是 [] 而不是 .聪明地下定决心!是哪个?!?【参考方案14】:

我认为您不应该使用模板引擎。相反,您应该使用Zend_View 之类的东西,它鼓励您将逻辑与表示分离,但允许您在 PHP 中构建表示层。

【讨论】:

Zend_View 它是一个模板引擎 我现在正在使用 Zend Framework 开始一个新项目,就像,哇,没有它我怎么能做到呢? :-)【参考方案15】: 您想使用带有 PHP 代码的文件作为模板吗?很好。 您想在上述模板中使用您的变量吗?很好。

请记住将逻辑和最终输出(表示)分开。使用模板框架可以更好地实现这一点。但是您不必学习 Smarty 之类的东西。

如果你使用 Zend_View 或类似的,你可以一直使用 PHP 代码。

这里很多人的回答都是正确的。 Smarty 不在 PHP 中进行模板化。离得很远。 Smarty 主要适用于那些必须使用设计人员(即非程序员)来编辑和设置页面显示的人。如果要更改页面布局的每个人都可以编程,那么您可以使用更面向 PHP 代码的模板系统。但是您确实应该准备好所有输出数据并将其发送到模板。如果您让每个页面获取、处理和显示内容,您将不得不早晚重构它。

【讨论】:

【参考方案16】:

当您为他人编写代码时。例如,我曾经参与创建一个应该为我们的客户定制的刚性 Web 应用程序框架。一个重要的要求是客户可以聘请设计师来修改模板而不必能够编程。更重要的是,他可能没有授权更改代码。

例如,Smarty 允许对模板的功能实施非常严格的限制。基本上,我们的应用程序禁用了除了最基本的代码结构和一组选定的修饰函数之外的所有内容。因此,模板引擎可以很好地实现我们的两个目标:simplicitysecurity

【讨论】:

【参考方案17】:

让我们不要忘记未来。网站几乎在发布的那一刻就已经过时了。您将需要在某个时候更新外观。如果你经常保持分离,一个设计师一个人就可以在后端使用相同的编程完成一个全新的网站。这允许更快、更便宜的重新设计,让您只在需要新功能时才让程序员参与。

【讨论】:

但是设计师可以不用 smarty 而用 php 来做到这一点。只是一些词:P a foreach 或 echo,对吗?【参考方案18】:

有些人可能会争辩说 Smarty 做了 PHP 已经可以做的事情:将表示与业务逻辑分开。 PHP 编程语言非常适合代码开发,但是当与 HTML 混合时,PHP 语句的语法管理起来可能会很混乱。 Smarty 通过使用更简单的基于标记的语法将 PHP 与演示文稿隔离开来弥补了这一点。标签显示应用程序内容,强制与 PHP(应用程序)代码完全分离。管理 Smarty 模板不需要 PHP 知识。

这种分离的重要性取决于情境。对于网页设计师来说,它通常比对 PHP 开发人员更重要。因此,当开发人员和设计人员的角色分开时,Smarty 通常是一个很好的选择。没有正确或错误的答案:每个开发团队对管理代码和模板都有自己的偏好。除了干净的基于标签的语法之外,Smarty 还提供了多种工具来管理演示:粒度数据缓存、模板继承和功能沙箱等等。业务需求和与 Smarty 一起使用的 PHP 代码将在确定 Smarty 是否合适时发挥重要作用。

【讨论】:

【参考方案19】:

我敢打赌,如果 PHP 模板语言如此强制以迫使您使用它,那么您根本不会使用它。在遇到麻烦时“跳出”并按照自己的方式做事的能力是 PHP 的吸引力之一。

我不是说它是一件好事,也不是说代码可以维护,只是在最初的考虑中,我不会选择完全阻止我的模板语言。

否则,我同意模板系统可以帮助您在编码和设计之间分配工作,并可能让设计师设计和编码给我们。

【讨论】:

【参考方案20】:

我个人总是在 php、python 等中使用模板引擎。

其他人已经提到的第一个明显原因:

这迫使您不要在模板中使用任何业务逻辑。

是的,只要你有纪律,纪律就好了。

但这只是使用模板引擎的一小部分原因。它们中的大多数不仅仅是一个引擎,而且可以被视为模板框架,无论你喜欢与否。

例如,Smarty 还具有部分缓存等高级缓存功能。真正有用的东西,当你只使用 php 作为模板语言时,你必须自己做所有的事情。

请不要忘记所有那些真正有用的帮助函数,只需在文档中快速搜索一下即可。它们中的大多数还提供了一种简单的方法来插入您自己的函数和/或工具包。

所以是的,这是一个选择问题。当需要真正简单的模板时,请考虑展示一些纪律,将您的逻辑排除在模板之外。但是当您期望您的应用程序增长时,您最终将需要模板框架的功能。到那时,您希望不要自己编写代码来重新发明***。

最后但并非最不重要的一点是,对我来说,某些模板框架中有一个杀手级功能。

模板继承

我是从Django 了解到的,现在我在最新的Smarty 3 中使用它。 Symphony 框架的人也有Twig,你可以考虑使用 Django 语法的端口。

乍一看有点奇怪,但是非常强大。您构建您的骨架并定义各种块。您可以扩展这样的骨架并用您的内容填充(覆盖)块。

对我来说,这是一个守门员!

【讨论】:

【参考方案21】:

模板管理系统,我们可以单独管理模板文件。系统执行时间会比普通的 PHP 项目更快。所以这里PHP文件和模板文件是分开维护的。

一旦运行文件,代码将保存在 template_c 中。所以它没有编译很多次。

【讨论】:

【参考方案22】:

我多次使用tinybutstrong,它的语法非常简洁。 html 模板中没有循环或伪代码。

从他们的主页:

TinyButStrong 是一个库,可让您动态创建 XML/HTML 页面和任何其他基于文本源的文件。它是 PHP 语言的模板引擎。它使您可以轻松显示 从您的数据库中获取信息,还要认真协调和 简化您的 PHP 编程。

TinyButStrong 是面向 HTML 的,但不是专门针对 Html 的。这 意味着它可以与文本文件、XML、RSS、RTF、WML、Excel 一起使用 (xml), ... OpenTBS 插件使您可以合并 OpenOffice 和 Ms 办公文件。

【讨论】:

【参考方案23】:

会大量使用 OOP 概念的开发人员,如 JAVA/Spring/Oracle PL-SQL 人,他们说 PHP 语言本身用于企业级项目中的演示/查看/显示逻辑。 在这些 BIG 项目中,后端是 Oracle,数据库是使用 pl-slq/java 获取的,演示文稿是 php。最好的例子是 facebook.http://en.wikipedia.org/wiki/Facebook facebook 使用 php 进行演示,java/c++ 作为后端接口。

使用 php 作为表示的唯一原因是因为它与 HTML 密切合作,但 java/c++ 更多基于 OOP,不能直接与 HTML 兼容。 告诉我一个使用 Smarty 的 CMS(joomla/drupal/wordpress)或框架(zend/symfony/Yii)?那么为什么需要 smarty 呢?

【讨论】:

【参考方案24】:

我喜欢使用模板有几个原因:

1) 它清理了 PHP 代码的可读性。当到处都有带有 HTML 块的 print("") 语句时,我的 PHP 文件变得臃肿且不美观。此外,还会出现一些问题,例如如何将变量传递到 HTML 文本中?你到处使用标签吗?您是否使用 print("") 并转义您的 HTML 引号并连接您的变量?你在 HTML 中使用 print("") 并使用单引号,违反标准,直接插入你的变量吗?

2) 它清理了 HTML 代码的呈现。如果生成的 HTML 在多个文件中被剪切和破解,就很难保持其良好的外观。例如,您的缩进可能会消失。

3) 它允许您创建多个模板,然后登录的用户可以在浏览您的网站时选择他想要显示的模板/皮肤,如果您还可以快速轻松地将默认模板更改为其他模板'很喜欢。

总的来说,这只是组织一切的更好方式。在必须学习和键入模板类命令、打开多个文件等方面有一些折衷。但在我看来,我认为这是值得的,因为代码的可读性和组织性都提高了。

【讨论】:

【参考方案25】:

总结一下,我补充一些我的想法。如果有可能,我们应该使用模板系统:

    缓存和代码压缩 提供一些安全层(变量的显示方式) 模板继承和代码html的重新制作(允许避免重复代码) 能够编写自己的插件/模块以改进写作视图 “照顾”翻译问题并将这个麻烦转移到视图层(在 Smarty 中没有内置模块,但有很好的社区解决方案)

【讨论】:

以上是关于为啥我应该在 PHP 中使用模板系统? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

播音系统放一会为啥会停止一会

为啥我的@yield() 没有显示内容?在 Laravel PHP 模板中

Android:我应该使用哪种图像格式,为啥? [关闭]

为啥这不是它应该的输出? [关闭]

为啥我的 4 个 PHP 输入中只有 1 个正确写入数据库? [关闭]

为啥这在php中给出0? [关闭]