天道酬勤,学无止境

与仅使用 PHP 相比,模板引擎的真正优势是什么?(What are the real advantages of templating engines over just using PHP?)

问题

我只使用 PHP 作为视图文件来开发我的 Web 应用程序,我觉得没有任何限制,但我听说有一致数量的开发人员提倡“外部”模板引擎。 那么模板引擎提供了哪些简单的 PHP 所缺乏的呢?

我正在寻找实用的东西,所以我排除了以下内容:

  • 照顾糟糕的开发人员(即使用模板引擎,因为它迫使您不要将代码混合到演示文稿中)
  • 语法的简洁性(我在 Vim 中有类似<?php echo $stuff; ?>类的映射,使用大括号不会有任何区别)
  • 非程序员更简单的语法(我独自开发所以这不是问题)
回答1

新语法


有些人不会同意,但因为我一直在使用 Twig,所以“for ... else”感觉是对的。 它可能不是很多,但它使我的模板更简洁。

{% for row in articles %}
 Display articles ...
{% else %}
 No articles.
{% endfor %}

自动逃逸


您可以让模板引擎自动转义任何输出。 这很棒,因为您不再需要在任何地方重复 htmlspecialchars ...。 Twig 很好地做到了这一点。

{% autoescape on %}
  Everything will be automatically escaped in this block
{% endautoescape %}

模板继承


我喜欢的另一个功能是扩展基本模板的能力。 这是一个基本的例子

base.html 模板

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  {% block head %}
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}{% endblock %} - My Webpage</title>
  {% endblock %}
</head>
<body>
  <div id="content">{% block content %}{% endblock %}</div>
  <div id="footer">
    {% block footer %}
      &copy; Copyright 2009 by <a href="http://domain.invalid/">you</a>.
    {% endblock %}
  </div>
</body>

child.html 模板

{% extends "base.html" %}

{% block title %}Index{% endblock %}
{% block head %}
  {% parent %}
  <style type="text/css">
    .important { color: #336699; }
  </style>
{% endblock %}
{% block content %}
  <h1>Index</h1>
  <p class="important">
    Welcome on my awesome homepage.
  </p>
{% endblock %}

子模板可以覆盖页面特定样式、内容等的块……您还可以注意到 {% parent %} 的使用,它获取父内容,因此您在覆盖时不会丢失所有内容。

我建议你试试 Twig。 非常有用。

回答2

关注点分离。

在使用 MVC/MTV 方法时,这类事情成为标准 - 数据的呈现必须与数据的显示分开,但如果您使用的是普通的 PHP,则不需要。

使用模板引擎可以轻松地将显示内容与显示方式区分开来。

我想你可能会争辩说这属于“照顾糟糕的开发人员”,因为一个好的开发人员无论如何都应该这样做,但在我看来,模板引擎也让优秀的开发人员更容易。

回答3

轻松切换视图

根据网络的当前状态,我需要以不同的格式提供我的信息:

  • 一个静态的 html 页面
  • 另一个 HTML 页面上的动态加载视图
  • 数据的 JSON 对象
  • 数据的 XML 提要,用于我的 flash 部分

这些格式的信息可以相同,只是视图不同。 使用某种模板引擎,我可以在这些视图之间快速切换。

回答4

使用模板,您还可以将演示文稿的责任委托给设计人员。 设计人员可以创建模板,开发人员可以在逻辑中工作。 保持演示文稿的一致性也更容易。

回答5
  1. 我用我自己的“模板”引擎,很基本的东西,转让value ,以[key]和排序。
  2. 当我第一次寻找模板引擎时,我发现它很聪明,但它有很多安全问题,我最终自己编写了我需要的东西。
  3. 你问为什么? 因为它有很多功能可以让你的编码更快(你没有想到的东西以及你可以委托给模板系统而不是你的代码的东西)
  4. 大多数编码员都选择了模板系统,在团队中工作时,您需要保持标准。
回答6

如果您想开发可以使用许多不同模板和布局进行定制的应用程序,同时保持设计与逻辑分离,例如针对不同的客户,您可能需要考虑使用模板系统。

但是,如果您的应用程序只需要一个模板并且从不大量更改布局,那么坚持适合您的内容,为什么要更改? :)

回答7

一些模板引擎可以编译模板,从而实现高度优化的转换。 以 .NET 中的 XslCompiledTransform 为例。

回答8

你的非答案看起来像真正的答案,但措辞非常居高临下。 例如:

照顾糟糕的开发人员(即使用模板引擎,因为它迫使您不要将代码混合到演示文稿中)

我称之为最小权力规则的应用。 它使您的模板对所有用户更有用,而不仅仅是“糟糕的开发人员”。

限制是什么使编程语言。 PHP 没有内联汇编功能,这并不是因为 Rasmus 认为你们都是“婴儿”。

回答9

当我需要沙箱时,我发现自己使用模板引擎。 例如,让托管 CMS 的用户编辑模板。

回答10

首先解决这里的答案和一般背景:

人们使用它们的主要原因是它们通常使事情更简洁。 这是否总是净收益值得怀疑。 学习一门新语言而增加的认知负担,并且手头没有宿主语言的灵活性,最终会带来比使用模板语言更多的缺点。 特别是 Twig 需要手动将核心 PHP 函数导出到它。 寻求简洁的最佳模板语言最好使用 tokeniser 扩展 PHP。

自动转义是另一个有问题的功能。 对于编码非常糟糕的开发人员,自动转义可能更安全,但否则会削弱安全性,将其放在心上,并期望在任何情况下默认情况下一切都是安全的。 一个真正安全的模板引擎需要知道很多关于它的上下文,有时这不能总是确定的,只有程序员知道某些东西去哪里了。 如果您需要安全编程,您需要有一个不依赖于自动转义的开发人员。 这也是 PHP 实际上可以做的事情,如果您标记 PHP 文件,您可以将原始文本与 PHP 分开并将 PHP 部分包装在输出缓冲环中,然后应用您喜欢的任何过滤器,因此这不是模板语言独有的功能。

一些模板引擎可以使预生成更容易一些,预编译可以使它们更快,但这也可以通过原生模板来实现。 有必要解析模板,这通常会降低它们的效率,并且使用它们的过程更加复杂。 引入的增加的复杂性模板很重要。 这通常可以从您身上抽象出来,但最终会困扰您,例如缓存问题(陈旧的条目),性能问题,调试时明显更加混乱和混乱,更多的层和更多的代码被执行,并且可能会出错的更多, 等等。

许多功能,例如扩展模板,您再次不需要使用 twig 来实现。 类似地,对于诸如 htmlspecialchars 之类的东西,大多数人会为他们经常使用的所有函数创建简短的辅助函数。

那么,你应该肯定使用模板语言,如枝条?

  1. 婴儿坐在糟糕的开发人员有点有效,尽管我不确定如果您必须使用诸如树枝之类的东西来尝试包含他们,他们是否应该被视为开发人员。 您还会嘲笑优秀的开发人员,您会想知道为什么让他们跳过箍来实现其他简单的事情。

  2. 您可能希望将模板提供给您可能希望处理 HTML 但不公开系统内部等的各方。例如,这可能是您拥有 CMS 的地方,用户可以编辑模板但与你的开发人员。 这与上述有关,但这是一个更真实的案例,您可能会从中受益,并且可能是合理的。

  3. 类似的情况是您可能希望在系统之间使用模板,在这种情况下,模板语言可以是一种可移植的解决方案。 这可能不仅是您拥有多个后端的地方,而且是您有不寻常的架构要求的地方,例如前向服务器呈现来自下游数据的视图。 更进一步,您可能需要可以呈现前端或后端的模板。 如果您只需要将数据传送到前端,因为它可以自己呈现视图,那么这会更有效。 但是,由于各种原因,您可能还必须回退到后端。

  4. 另一种情况是静态分析,包括跨多种语言。 大多数语言通过字符串连接有效地模板化,并且不知道您正在生成的语言。 在某些情况下,当您可以完全解析模板语言、语言和 HTML 时,模板语言可以提供好处。 实现此目的的另一种方法是尽可能多地使用 HTML 本身进行模板来表示事物,例如使用类等,以及 HTML 提供的工具可以让您将行为附加到事物上。 模板语言也可以比 PHP 更易于解析,即使您不能同时解析您正在使用的模板语言。这可用于优化或具有更容易转译的模板。

  5. 您的语言确实不适合创建 HTML 和其他语言。 PHP 是一种模板语言,因此在大多数情况下,使用模板语言的作用很小,但会产生很大的拖累。 但是,如果您正在使用诸如 Java 之类的东西,那么您很可能需要一个模板引擎。 模板语言是一种 DSL,但如果您已经拥有一个能够很好地完成它们的工作的 DSL,那么它就是 YAGNI。

  6. 定制模板。 如果您有特定的输出格式和域,可以从定制的模板语言中受益匪浅。 这取决于您的输出格式。

所有这些情况都是特定于情况的,并且不常见到默认情况下应该使用模板语言。 模板语言仅以不同程度的成功来解决这些问题(例如,许多不知道 HTML)。 如果我将 Twig 排名 10(满分 10 分),平均每项的表现与 5 分相差不远。

您可以将 Twig 转换为 PHP,但不能将 PHP 转换为 Twig。 这有时很有用,但它会带来相当大的成本,因为您失去了 PHP 的很多灵活性。

在我接触过的少量 Twig 内件中,质量也很差,或者进口的标准很差。 例如,当我五年前第一次尝试时,解析器不支持或至少不支持保留空格。 我有一个需要重构的场景,这意味着我需要能够解析 Twig,修改并再次输出它以在数千个模板中重写代码,Twig 不支持它,我不得不自己浏览解析器。

同样,我最近调查了 Twig 的逃逸。 特别是 JS 转义脱颖而出,它支持转义 JS 字符串和其他奇怪的东西,而不是简单地使用 json_encode。 您在框架中获得的自定义转义很可能是错误的。 自己做通常更可靠和安全(只要你知道如果你 JSON 编码一个包含字符串并将其模板化为 javascript 文字而没有足够的转义会发生什么,例如)。

在大多数情况下,数百甚至数千行用于转义、清理等的魔法模板系统和其他相关系统是可怕的做法,试图猜测你的场景或试图迎合每一个可能的场景,为奇怪的错误增加更多的空间数据损坏,增加更多安全失误的机会等。通常你会发现框架中的这些东西可以用更安全的一两行功能代替。 您有时还会有其他愚蠢的事情,例如一遍又一遍地处理某些事情,以防万一,因为该框架对您在做什么很天真,好像您自己制作的东西一样,您完全知道自己在做什么和不做什么”然后会有一些事情,比如一遍又一遍地消毒相同的字符串。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 为什么要在PHP中使用模板系统? [关闭](Why should I use templating system in PHP? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 10个月前关闭。 改善这个问题 为什么要在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> 我真的没有任何区别。 回答1 是的,正如您所说,如果您不强迫自己在PHP内部使用模板引擎(模板引擎),则很容易滑倒并停止分离问题。 但是,遇到问题分离的人最终会生成HTML并将其提供给smarty,或者在Smarty中执行PHP代码,因此Smarty很难解决您的问题分离问题。 也可以看看
  • 什么是好的 PHP 模板系统? [关闭](What's a good templating system for PHP? [closed])
    问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 5年前关闭。 改进这个问题 什么是最好/最容易为 PHP 集成模板系统的系统,使用它有什么好处? 我目前根本不使用,我认为将内容与演示分开可能会有所帮助。 回答1 聪明的 我发现它快速、易于使用且易于安装(即使在共享托管环境中)。 它也不要求您使用验证 XHTML,这有时很方便(尽管我认为确实需要有效 XHTML 的模板引擎可能更快。) 将您的内容放在一个地方并在其他地方编写代码真是太好了。 此外,您不仅限于 HTML。 我使用 Smarty 生成XML甚至SQL 。 回答2 PHP 本身就是一种非常好的模板语言。 出于这个原因,大多数领先的 PHP 框架不使用单独的模板语言。 只要确保您使用(类似的东西)MVC,并且不要在您的视图文件中进行任何数据访问或业务逻辑。 我也广泛使用 Smarty,但发现它与纯 PHP 相比没有什么优势,除了迫使您保持视图愚蠢。 对设计师来说,它也可能看起来好一点,但缺点是对你这个模板实现者来说是灵活性的。 像在三重嵌套数组上循环这样的事情比直接使用 PHP 更难。 回答3 为了跟进 Alex 所说的内容,我建议您阅读 Rasmus Lerdorf 的文章无框架 PHP MVC 框架。
  • 无逻辑模板(例如胡须)的优点是什么?(What's the advantage of Logic-less template (such as mustache)?)
    问题 最近,我遇到了据称是无逻辑模板的胡须。 但是,没有任何解释说明为什么以无逻辑方式进行设计。 换句话说,无逻辑模板的优点是什么? 回答1 换句话说,它可以防止您用脚射击。 在过去的JSP时代,JSP文件中充斥着Java代码是很常见的,由于您的代码分散,因此重构变得更加困难。 如果您通过设计来防止模板中的逻辑(如胡须那样),您将不得不将逻辑放在其他地方,因此模板最终将变得整洁。 另一个优点是,您不得不按照关注点的分离方式进行思考:在将数据发送到UI之前,控制器或逻辑代码将必须进行数据批量处理。 如果以后再将模板切换为另一个模板(假设您开始使用其他模板引擎),则转换将很容易,因为您只需要实现UI详细信息(因为模板上没有逻辑,请记住)。 回答2 我觉得自己几乎独自一人,但我坚决站在对面的阵营中。 我不认为在模板中可能混合使用业务逻辑就没有充分利用编程语言的全部功能了。 无逻辑模板的通常论点是,如果您拥有对编程语言的完全访问权限,则您可能会混入模板中没有位置的逻辑。 我发现这类似于推理,您应该使用勺子切肉,因为如果您使用刀子,可能会割伤自己。 这是真的,但是即使谨慎使用后者,您的工作效率也会大大提高。 例如,考虑使用胡子的以下模板片段: {{name}}: <ul> {{#items}} <li>{{.}}</li> {{/items}} </ul> 我能理解这一点,但是我发现以下内容
  • PHP中Heredoc与NowDoc的优点/不便(Advantages / inconveniences of heredoc vs nowdoc in php)
    问题 作为一个新手,我建议最好使用Heredoc而不是太多的嵌套代码(请参阅php代码中的意外T_ELSE)。 但是我无法理解Heredoc和nowdoc之间是否有重大区别。 与Heredoc和nowdoc相比,对于另一个对新手来说很重要的优势是什么(即不是非常小的优势,但对我来说很重要)。 回答1 Nowdocs是单引号字符串,heredocs是双引号字符串。 nowdoc的指定方式与heredoc相似,但是在nowdoc内不进行任何解析。 该结构非常适合嵌入PHP代码或其他大型文本块,而无需进行转义。 http://php.net/manual/zh-CN/language.types.string.php#language.types.string.syntax.nowdoc 换句话说: $foo = 'bar'; $here = <<<HERE I'm here, $foo ! HERE; $now = <<<'NOW' I'm now, $foo ! NOW; $here是“我在这里,吧!” ,而$now是“我$now是$ foo!”。 。 如果您不需要变量插值,但是在字符串中需要$类的特殊字符,Nowdocs会更易于使用。 就这样。 回答2 这里的文档 1. heredocs文本的行为就像带双引号的字符串,没有双引号。 不需要2.在定界符行情进行转义,但转义符\ n换行
  • 人们对动态语言有什么吸引力? [关闭](What do people find so appealing about dynamic languages? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 似乎每个人最近都在使用动态的,未编译的潮流。 我主要只使用编译的静态类型语言(C,Java,.Net)工作。 我对动态语言的经验是诸如ASP(Vb脚本),JavaScript和PHP之类的东西。 在考虑动态语言时,使用这些技术给我留下了不好的印象。 编译器通常会捕获诸如拼写错误的变量名以及为变量分配错误类型的值之类的东西,直到运行时才发生。 即使那样,您可能也不会注意到错误,因为它只是创建了一个新变量,并分配了一些默认值。 我也从未见过intellisense在动态语言中能很好地工作,因为变量没有任何显式类型。 我想知道的是,人们对动态语言的吸引力是什么? 就动态语言允许您完成的事情或在编译语言中很难做到的事情而言,主要优势是什么? 在我看来,我们早就决定了,诸如未编译的ASP页面引发运行时异常之类的事情是一个坏主意。 为什么会有这种类型的代码复活? 至少在我看来,为什么Ruby on Rails看起来真的不像10年前用ASP无法完成的任何事情
  • AngularJS有什么比jQuery更好的功能? [关闭](What does AngularJS do better than jQuery? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 6年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 我主要使用jQuery库,并且刚开始使用AngularJS。 我已经阅读了一些有关如何使用Angular的教程,但是我不清楚为什么使用它或何时使用它,或者与仅使用jQuery相比,我会发现什么好处。 在我看来,Angular使您想到MVC,这也许意味着您将网页视为模板+数据组合。 只要感觉到会有动态数据,就使用{{data bindings}} 。 然后,Angular将为您提供一个$ scope处理程序,您可以静态地填充它,也可以通过对Web服务器的调用来填充它。 这看起来与JSP设计网页的方式在特征上相似。 我需要Angular吗? 对于不涉及数据处理的简单DOM操作(例如,鼠标悬停时的颜色更改,单击时隐藏/显示元素),jQuery或Vanilla JS足够且简洁。 这是假设angular的mvc中的模型可以反映页面上的数据,因此,诸如颜色,显示/隐藏等更改的CSS属性不会影响该模型。 在DOM操作方面,Angular是否比jQuery或Vanilla JS有任何优势? 与jQuery可以与插件一起进行的工作相比,Angular可以做什么使它对开发有用? 回答1 数据绑定 您四处制作网页
  • 什么是NoSQL?它如何工作?它提供什么好处? [关闭](What is NoSQL, how does it work, and what benefits does it provide? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 7年前关闭。 改善这个问题 我一直在听到有关NoSQL的信息,由于数据库交互通常是提高网络速度的瓶颈,因此它最终可能会替代SQL DB存储方法。 所以我有几个问题: 到底是什么它是如何工作的? 为什么它会比使用SQL数据库更好? 那有什么好呢? 该技术是否太新而无法开始实施,还是值得一看? 回答1 到底是什么一方面,它是特定的系统,但对于不遵循关系数据库模型的各种新数据存储后端,它也已成为通用词。 它是如何工作的? 标记有通用名称的每个系统的工作方式都不同,但是基本思想是通过使用不支持通用RDBMS的所有功能但仍然足够有用的数据库模型来提供更好的可伸缩性和性能。 在某种程度上,它就像MySQL,MySQL曾一度缺乏对事务的支持,但正因为如此,它的表现要优于其他DB系统。 如果您可以以不需要交易的方式编写应用程序,那就太好了。 为什么它会比使用SQL数据库更好? 那有什么好呢? 如果您的站点需要如此大规模地扩展,最好在您负担得起的最佳硬件上运行最好的RDBMS,并尽可能地对其进行优化,以使其根本无法承受负载,那将是更好的选择。 它的改善程度取决于特定的用例(在“传统” RDBMS上很难进行大量的更新活动,并且要进行大量的联接)-在极端情况下
  • 什么是使用最广泛的C ++向量/矩阵数学/线性代数库,以及它们的成本和收益之间的取舍? [关闭](What are the most widely used C++ vector/matrix math/linear algebra libraries, and their cost and benefit tradeoffs? [closed])
    问题 关闭。 此问题不符合堆栈溢出准则。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使它成为Stack Overflow的主题。 3年前关闭。 改善这个问题 似乎许多项目慢慢地需要进行矩阵数学运算,并陷入了以下陷阱:首先构建一些矢量类,然后缓慢地添加功能,直到被困于建立一个半确定的自定义线性代数库并依赖它。 我想避免这种情况,同时又不依赖于某些切向相关的库(例如OpenCV,OpenSceneGraph)。 那里最常用的矩阵数学/线性代数库是什么,为什么会决定使用另一个? 有什么建议不建议使用的吗? 我专门在几何/时间上下文*(2,3,4 Dim)*中使用它,但将来可能会使用更高维度的数据。 我正在寻找以下方面的差异:API,速度,内存使用,广度/完整性,狭窄性/特异性,可扩展性和/或成熟度/稳定性。 更新 我最终使用了我非常满意的Eigen3。 回答1 为此,有很多项目已经选择了通用图形工具包。 那里的GMTL很不错-它非常小,非常实用,并且被广泛使用以使其非常可靠。 OpenSG,VRJuggler和其他项目都已转而使用此方法,而不是使用自己的手动Vertor /矩阵数学方法。 我发现它非常不错-它可以通过模板完成所有操作,因此非常灵活且非常快。 编辑: 在讨论讨论和进行编辑之后,我想我会抛出更多有关特定实现的优点和缺点的信息
  • java春招面试冲刺系列:JSP知识总结
    JSP知识总结 目录 JSP简介JSP-Velocity-FreeMarker对比JSP结构JSP生命周期JSP语法JSP-HTTP状态码JSP表单处理JSP编码设置JSP是不是被淘汰JSP Velocity FreeMarker对比JSTL库安装 JSP简介 什么是Java Server Pages? JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。 JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。 JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。 为什么使用JSP? JSP程序与CGI程序有着相似的功能,但和CGI程序相比,JSP程序有如下优势: 性能更加优越,因为JSP可以直接在HTML网页中动态嵌入元素而不需要单独引用CGI文件。服务器调用的是已经编译好的JSP文件,而不像CGI/Perl那样必须先载入解释器和目标脚本。JSP基于Java Servlets API,因此
  • 许多基于backbone.js 的框架在现实世界中的优势和劣势是什么? [关闭](What are the real-world strengths and weaknesses of the many frameworks based on backbone.js? [closed])
    问题 关闭。 这个问题是基于意见的。 它目前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑这篇文章用事实和引文来回答问题。 4年前关闭。 改进这个问题 希望有人可以分享他们对一些最新出现的backbone.js 变体的经验。 我在几个项目中对主干/下划线/需求有一些很好的经验,我想朝着更高级的复杂应用程序结构解决方案迈出下一步。 我知道以下框架可用: 木偶 Geppetto(基于牵线木偶) 卓别林,卓别林 - 卓别林样板椎骨布局管理器胸部光环卢卡新歌背叠主干用户界面绿巨人顺便说一句 - 大型项目的绝佳起点 可能我错过了一些。 这里有一个关于差异的简短介绍: 演讲台谈话链接 但它很一般。 我想知道是否有人可以分享他们使用这些框架在现实生活中的应用程序的经验。 选择一个而不是另一个有什么好处? 例如,木偶什么时候会成为比卓别林更好的解决方案,或者为什么 vetebrae 更适合某些应用。 当然,显而易见的答案是“使用最适合您的需求”,但我缺乏使用这些框架的经验来了解它们的优势/目的/优势或首选方案。 谢谢! 编辑 1:找到这篇文章:Backbone.Marionette vs Backbone-Boilerplate 编辑 2: Mathias schafer(卓别林)通过邮件回答: 简而言之,当前的结构接近于 1.0 版本,因为它已经在生产中使用了。 在 1.0 之前
  • 为什么要在Google App Engine上使用Django?(Why use Django on Google App Engine?)
    问题 在研究Google App Engine(GAE)时,很明显,使用Django在基于GAE的Python中进行开发非常流行。 我一直在网上搜索有关使用Django的成本和收益的信息,以了解为什么它如此受欢迎。 尽管我已经找到了很多有关如何在GAE上运行Django的资料以及各种实现方法,但是我还没有找到任何比较分析来说明为什么Django比使用Google提供的webapp框架更可取。 明确地说,对于在Django中具有现有技能的开发人员(毫无疑问是大多数Python网络开发人员)或在Django中具有现有代码的开发人员(在其中使用GAE更像是移植练习),为什么在GAE上使用Django很有用。 但是,我的团队正在评估GAE是否可用于全新项目,而我们现有的经验是使用TurboGears,而不是Django。 当BigTable库已替换Django的ORM,会话和身份验证已更改且Django的模板(如果需要)而无需使用整个Django堆栈时,很难确定Django为什么对开发团队有利。 最后,很明显,如果我们以后想离开GAE并需要一个平台来出走,那么使用Django确实具有提供“退出策略”的优势。 我非常感谢您指出为什么在GAE上使用Django比使用webapp更好的方法。 我也对Django完全没有经验,因此详细介绍适用于GAE的较小功能和/或便利性对我来说也很有价值。
  • 在HEREDOC字符串中调用PHP函数(Calling PHP functions within HEREDOC strings)
    问题 在PHP中,HEREDOC字符串声明对于输出html块确实非常有用。 您可以通过在变量前面加上$来解析变量,但是对于更复杂的语法(例如$ var [2] [3]),则必须将表达式放在{}中。 在PHP 5中,有可能实际上使{}一个HEREDOC字符串中括号内的函数调用,但你必须要经过一些工作。 函数名称本身必须存储在变量中,并且必须像动态命名函数一样调用它。 例如: $fn = 'testfunction'; function testfunction() { return 'ok'; } $string = <<< heredoc plain text and now a function: {$fn()} heredoc; 如您所见,这不仅比以下情况更混乱: $string = <<< heredoc plain text and now a function: {testfunction()} heredoc; 除了第一个代码示例外,还有其他方法,例如突破HEREDOC来调用该函数,或反转问题并执行类似的操作: ?> <!-- directly output html and only breaking into php for the function --> plain text and now a function: <?PHP print
  • 每个PHP程序员应该知道什么? [关闭](What should every PHP programmer know? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 改善这个问题 我想成为一名PHP / MySQL程序员 我必须知道哪些技术? 喜欢: 构架集成开发环境模板引擎 Ajax和CSS框架 请告诉我我必须知道的最低要求,并告诉我您在上一个列表中最喜欢的东西? 谢谢 回答1 首先,没有必要了解有关学习PHP和MySQL的知识。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 如果必须要知道,那么没有人能够进入PHP和MySQL开发。 我个人认为,在不了解所有内容的情况下,您对此稍有优势。 它会带给您全新的视角和跳脱框框的想法:) 至于该线程中的面向对象的东西,这是真的。 但是,正如其他人所说,完全由程序员(您)来决定如何编写代码。 您可以使用面向对象的实践,建立意大利面条式代码连接或仅执行一堆函数之类的操作。 无论哪种方式,就像其他人都说的那样,这取决于您:) IRC频道: 并不是真的需要这个,但是我发现它很有帮助...在这里见:) irc.freenode.net #php 手动的: 该手册是您的朋友,可能是您潜水之前唯一应了解的内容。 http://www.php.net/manual/zh/ http://dev.mysql.com/doc
  • 与 PHP 相比,Python 在 HTML 中“流动”的效果如何?(How nicely does Python 'flow' with HTML as compared to PHP?)
    问题 我正在考虑在 Web 应用程序中从使用 PHP 切换到 Python,但我想知道 Python 是否像 PHP 一样熟练地将 HTML 编入和编出。 从本质上讲,我发现使用<? and ?> <? and ?>把 PHP 放在我想要的地方,然后我可以随意安排/组织我的 HTML。 用 Python 做这件事也一样容易吗? 从根本上说,问题是:在易用性方面,使用 Python 使用 HTML 是否类似于使用 PHP 使用 HTML? 编辑:我想有助于澄清下面评论中的一些混乱,我的直觉是 PHP 在组织网站的前端和展示部分方面会比 Python 更好,而 Python 在后端会表现出色部分(实际编程...)。 问题是 - 我错了,Python 和 PHP 一样适用于前端吗? 编辑我的编辑:啊,我开始理解我的方式的错误; 看来我在不知不觉中养成了一些坏习惯。 我一直认为可以(阅读:标准),例如,让伪代码中的 PHP 执行以下操作: If user has filled out form: print this html else: print this html 实际上,我应该使用 HTML 模板,并在 sep 中使用 PHP。 文件。 在这种情况下,PHP 和 Python 处于一个势均力敌的领域,这可能取决于我自己的编程语言口味。 回答1 您无法轻松地比较 PHP 和
  • 使用DAO模式的优缺点(Pros and cons of the use of the DAO pattern [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 正如我在标题中提到的,我很想知道您(作为经验丰富的开发人员)对DAO模式的使用有何看法,特别是在Web应用程序中。 您发现了哪些优势,而又讨厌使用它的后果? 回答1 我所见过的DAO的问题在于,它们通常一直都在处理完整的对象。 这会产生完全不需要的开销,而这些开销在简单查询中是不会存在的。 例如,如果要从数据库参考数据中创建一个下拉列表,则DAO用户可以简单地说:“让我获得该表的对象集合,其中y由z排序”。 然后,该数据将在下拉列表中使用,但通常仅用于键/值组合,而忽略检索和映射的对象中的所有其他内容(创建的数据,最后更新用户,是否处于活动状态等) 。 即使这种按摩发生在DAO调用附近并且对象在检索时也没有存储(不幸的是,通常情况并非如此,不幸的是,对象经常被包装在ac:forEach(JSP)中并进行迭代以产生下拉列表) ),它仍然会产生不必要的数据库和网络开销,更不用说暂时增加了容纳这些对象的内存。 现在,这并不是说不能将DAO设计为检索参考数据的Map-当然可以。 但是通常它们用于完整的对象映射,而这并不是一直需要的。 保存时,这是一种优势,但是检索数据时,它是IMO的劣势-当然,您会得到所有
  • 为什么我会在Java / Spring上使用Scala / Lift? [关闭](Why would I use Scala/Lift over Java/Spring? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 我知道这个问题有点悬而未决,但是我一直在将Scala / Lift视为Java / Spring的替代品,我想知道Scala / Lift在此之上的真正优势是什么。 从我的观点和经验来看,Java Annotations和Spring确实最小化了您为应用程序要做的编码量。 Scala / Lift是否会对此有所改善? 回答1 假设我们对Scala和Java同样满意,并忽略(巨大的)语言差异,除非它们与Spring或Lift相关。 在成熟度和目标方面,Spring和Lift几乎完全相反。 春天比Lift大五岁提升是整体的,仅针对网络; Spring是模块化的,同时针对Web和“常规”应用程序 Spring支持大量的Java EE功能。 升降机忽略了这些东西 一句话,Spring是重量级的,Lift是轻量级的。 有了足够的决心和资源,您就可以轻而易举地做到这一点,但是您将同时需要很多。 在使用这两个框架之后,我想到的是具体的差异。 这不是一个详尽的列表,无论如何我都无法编译。 对我来说,最有趣的事情就是…… 查看哲学提升鼓励在片段/动作方法中放置一些视图材料。 摘录代码尤其将散布以编程方式生成的表单元素<div> , <p
  • JavaScript引擎的优势(Javascript Engines Advantages)
    问题 我现在对JavaScript引擎感到困惑。 我知道V8很大,因为它可以将JavaScript编译为本地代码。 然后,我开始阅读有关Mozilla SpiderMonkey的信息,据我所知,Mozilla SpiderMonkey是用C编写的并且可以编译JavaScript。 那么,这与V8有什么不​​同?如果这是事实,那么Firefox为什么不这样做呢? 最后,Rhino是否将JavaScript真正地编译为Java字节码,以便您获得Java的所有速度优势? 如果不是,为什么人们在台式机上编写脚本时不运行V8? 回答1 即使执行JIT,也有多种执行JavaScript的方法。 V8和Nitro(以前称为SquirrelFish Extreme)选择执行全方法JIT,这意味着它们在遇到脚本时会将所有JavaScript代码编译为本机指令,然后像执行已编译的C代码一样简单地执行。 SpiderMonkey改用“跟踪” JIT,它首先将脚本编译为字节码并进行解释,但监视执行情况,寻找“热点”(例如循环)。 当它检测到一个时,然后仅编译该机器代码的热路径,并在将来执行该路径。 两种方法都有优点和缺点。 完整方法JIT确保所有执行的JavaScript都将作为机器代码编译和运行,而不是被解释,这通常应该更快。 但是,取决于实现方式,这可能意味着引擎会花费时间来编译永远不会执行的代码
  • 使用Websockets代替RESTful HTTP有什么陷阱?(What are the pitfalls of using Websockets in place of RESTful HTTP?)
    问题 我当前正在从事一个项目,该项目要求客户端请求一项繁重的工作并将其发送到服务器。 然后,服务器对作业进行划分,并以一组URL进行响应,以使客户端进行GET调用并流回数据。 我是该项目的新手,目前正在使用Spring Websocket来提高效率。 Websocket现在将直接联系客户端hooray,而不是客户端不断对服务器进行ping操作以查看是否有准备好流回的结果,而是直接与客户端hooray联系! 让websockets从头到尾管理整个过程会是一个坏主意吗? 我正在将STOMP与Spring websockets一起使用,放弃REST还会有重大问题吗? 回答1 使用RESTful HTTP,您可以拥有一个无状态的请求/响应系统,在该系统中,客户端发送请求,服务器返回响应。 使用webSocket,您可以有状态(或可能有状态)的消息传递系统,在该系统中,可以以任何一种方式发送消息,并且发送消息的开销比RESTful HTTP请求/响应的开销低。 两者是具有不同强度的完全不同的结构。 连接的webSocket的主要优点是: 双向通讯。 因此,服务器可以随时将任何情况通知客户端。 因此,客户端可以建立一个webSocket并仅侦听来自服务器的任何消息,而不是按固定的时间间隔轮询服务器以查看是否有新消息。 从服务器的角度来看,当发生客户端感兴趣的事件时
  • 什么是阿里云速成美站?云速成美站有什么优势?
    阿里云·速成美站(CloudWebsite)是一款自助建站产品。预置海量模板,类PPT操作,便捷、低成本的解决您的建站问题。标配阿里云服务器,快速稳定,下载阿里云App可轻松备案,域名一键解析,网站轻松上线。阿里云·速成美站是面向企业/个人提供的一款自助建站产品。预置海量模板,类PPT操作设计,便捷、低成本的解决您的建站问题。点击进入:阿里云速成美站阿里云速成美站产品版本有以下几种:阿里云·速成美站集成云服务器、云数据库、对象存储、全球加速、负载均衡、Web应用防火墙等,确保网站快速、安全。云·速成美站包括1000余套精美模板覆盖多个行业,将常见的网页样式、网站功能全部封装成控件模块,集成到可视化设计器,用户可通过拖拽、编辑、设置等操作即可自行搭建PC网站、手机站、微信公众号及小程序。可视化全功能管理后台,真正做到“会打字,就能建网站”。云速成美站有什么优势?云·速成美站的优势,与其他建站类产品相比,云·速成美站不仅主流功能全具备,通用场景全覆盖,而且支持IPv6+IPv4双端访问,上线更快速,网站更安全。1、主流功能全具备PC+手机+公众号+小程序四站合一,全功能可视化操作界面,无需技术玩转建站。提供电商功能及会员管理功能,支持多语言切换、阿里云视频、阿里云短信。客服团队为您提供7*12小时(9:00-21:00)在线售后保障,并配有索索引擎优化
  • Java中的Word文档创建API(Word document creation API in Java)
    问题 我想使用模板创建Word文档,替换一些变量(字段)并将其另存为新的Word文档。 我在考虑使用Apache POI,http://poi.apache.org/是否最适合此目的? 您可以分享您的印象吗? 回答1 我以前使用过POI,并且肯定可以生成Word文档。 但是魔鬼在细节上。 Word具有成千上万的功能:您可以将编号为13的带有负缩进的列表放到另一个表(本身是项目符号列表的一部分)中所包含的表的两个连接单元中……您就明白了。 当POI文档说它们还在进行中时,这反映出试图追赶Word(对我们来说,未记录)的规范可能是一种永恒的状态。 POI很好地支持了具有合理“正常”使用特征集的文档,POI的界面和方法合理且一致,但有时需要一些工作。 但是正如Pascal所说,RTF也支持功能不太高的文档集。 我几乎没有“做” RTF的经验,但它可能比使用POI更简单。 如果您在环境中工作或为客户坚持要求您生成的文档是.DOC而不是.RTF ,那么POI几乎是您唯一的选择,除非您可以引入使用Office自动化的步骤将RTF转换为DOC。 更新:在此期间,我还有更多想法。 实际上,您可以在任何平台上使用POI或创建RTF文档。 例如,在我的工作中,所有进行此类处理的服务器都在运行Linux。 但是,在您的程序可能在Windows下运行的情况下,还有另一种选择: Jacob http:/