前言

    毫无疑问,在PHP邮件列表中问的最多的一个问题就是:如何使我的PHP脚本与布局无关?虽然PHP是“嵌入HTML的脚本语言”,但是在编写了若干个项目,自由地混合着PHP和HTML后,你可能会想到将内容和呈现分离会是件好事 [TM]。另外,在很多公司中,布局设计者和程序员的角色是分割的。于是,对基于模板的解决方案的探索就开始了。

    就以我们公司为例,一个应用的开发流程是这样的:一旦需求文档准备就绪,界面设计人员建立了界面模型并交给程序员。程序员用PHP实现商业逻辑并使用界面模型创建框架模板。项目然后交给了HTML设计者及网页界面设计人员,由他们将模板美化到极致。项目可能在编程和HTML设计之间来回多次。因此,模板支持的好坏就非常重要,因为程序员不想与HTML打叫道,也不想HTML设计者对PHP代码加以捣乱。设计人员需要配置文件,动态块和其它界面事项的支持,但是他们不想和PHP编程语言本身的错综复杂打交道。

    观察当今PHP可用的模板方案就会发现,大多数提供了一个基本的方法在模板中替换变量,动态块功能的实现有限。但是,我们的要求会更多一些。我们根本不想让程序员与HTML布局打交道,但是这几乎是不可避免的。例如,假定设计者希望背景色在动态块中交替变化,就必须实现和程序员协同。我们也希望设计者能使用他们自己的配置文件,将其中的变量替换到模板中去。这个列表还可以这么列下去。

    1999年末,我们开始书写模板引擎的规范。规范完成后,我们开始用C编写一个模板引擎,希望能被PHP接受,包含在其中。我们不但遇到很多复杂的技术难关,也经历了若干热烈的讨论:模板引擎到底应该做和不应该做什么。基于这样的经验,我们决定这个模板引擎应该用PHP中的类来写成,给任何觉得适用的人加以使用。于是我们写了这么一个引擎,能做的事情恰如前述,而SmartTemplate诞生了(注意:这个类从未公开过)。这个类可以实现我们想要的几乎任何事情:正则变量替换,支持包含其他模板,与配置文件的整合,嵌入PHP代码,有限的'if'语句功能以及更健壮的动态块支持多重嵌套。所有这些都用正则表达式实现,而代码——允许我们这么说——几乎是不可理喻的。同样的,在大型应用中,也出奇的慢,因为需要在每次调用时进行解析和正则表达式的运算。从程序员的角度看,最大的问题是,PHP脚本中必须要进行一些工作来设置和处理模板和动态块。如何才能使之更简单呢?

    于是产生了一个后来最终成为Smarty的想法。我们都知道PHP代码在没有模板解析的额外开销后可以运行的有多快。我们也知道对于一般的设计人员,PHP语言会显得多么审慎和傲慢,而这一点通过大大简化的模板语法会得以隐藏。如果我们结合这两个长处会如何?于是,Smarty诞生了…… :-)