引入
假设不使用模板引擎,会有一个问题是,php代码和html代码混在一个文件中,而我们知道php是后台程序员做的,html属于前端开发人员的工作内容,如果杂糅在一起,一旦以后修改,导致的问题就是php程序员也要去看html,html前端需要去看php代码。耦合非常严重,怎么把表现层和逻辑层区分开就显得尤为重要了。
现在已经有了很多解决方案,几乎可以将网站的页面设计和php应用程序完全分离。这些解决方案成为模板引擎,它们正在逐步消除由于缺乏层次分离而代码的难题。
模板引擎的原理非常简单。只要将美工页面(不包含php代码)指定为模板文件,并将这个模板文件中动态的内容,如数据库输出、用户交互等部分,定义成使用特殊“定界符”包含的”变量“,然后放在模板文件中相应的位置。当用户浏览时,由php脚本程序打开该模板文件,并将模板文件中定义的变量进行替换。这样,模板文件中的特殊变量被替换为不同的动态内容时,就会输出需要的页面。
模板引擎的难点在于语法的掌握,不过对于程序员来说,这块不必过于关注,这些应该是前端的事情。
Smarty简介
Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的逻辑内容不会影响到美工的页面设计,美工重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。
优点:
速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。
编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件, 这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中, 而不再进行模板重新编译(在源程序没有改动的情况下)
缓存技术:smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,
当设定smarty的cache属性为true时, 在smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来, 这相当于调用一个静态的HTML文件。插件技术:smarty可以自定义插件。插件实际就是一些自定义的函数。
模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。
不适合smarty的地方:
需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty会使模板处理速度变慢。
小项目。小项目因为项目简单而美工与程序员兼于一人的项目,使用smarty会丧失php开发迅速的优点。
为项目集成Smarty
1.解压下载的Smarty-2.6.25压缩包
2.拷贝libs文件夹到WEB程序目录下,我的目录为test\smarty
3.在安装完Smarty模板后,我们开始简单使用Smarty。
我的第一个Smarty demo
test.htm
<html>
<head>
<meta http-equiv="content-type" content="text/html" charset="utf-8">
<title>{*$title*}</title>
</head>
<body>
{*$content*}
</body>
</html>
init.inc.php
<?php
/**
* Created by PhpStorm.
* Date: 16/8/15
* Time: 15:49
*/
require "libs/Smarty.class.php";
$smarty = new Smarty();
$smarty->template_dir = "templates";
$smarty->compile_dir = "templates_c";
$smarty->config_dir = "config";
$smarty->cache_dir = "cache";
$smarty->caching = true;
$smarty->left_delimiter = "{*";
$smarty->right_delimiter = "*}";
index.php
<?php
/**
* Created by PhpStorm.
* Date: 16/8/15
* Time: 16:03
*/
require "init.inc.php";
$smarty->assign("title", "测试用的网页标题");
$smarty->assign("content", "测试用的网页内容");
$smarty->display("test.htm");
?>
运行效果: