http://blog.ipodmp.com/archives/php-write-a-mini-smarty-template-engine/

迷你版Smarty模板引擎目录结构如下:

① 要开发一个模板引擎,最主要的有两个类,分别是模板引擎入口类和模板解析类。

A.首先创建MiniSmarty目录,然后新建一个文件名为MiniSmarty.class.php

其代码如下:

<?php

//MiniSmarty模板引擎

class MiniSmarty {

//模板文件

public $template_dir = 'templates';

//编译文件

public $compile_dir = 'templates_c';

// 缓存文件

public $cache_dir = 'cache';

// 模板变量

public $_tpl_var = array();

// 是否开启缓存

public $caching = false;

public function __construct()  {

$this->checkDir();

}

//检查目录是否建好

private function checkDir()  {

if(!is_dir($this->template_dir))   {

exit('模板文件目录 templates 不存在!请手动创建');

}

if(!is_dir($this->compile_dir))   {

exit('编译模板 templates_c不存在!请手动创建');

}

if(!is_dir($this->cache_dir))   {

exit('缓存文件目录 cache 不存在!请手动创建' );

}

}

//模板变量注入方法

public function assign($tpl_var, $var = null)  {

if(isset($tpl_var) && !empty($tpl_var))   {

$this->_tpl_var[$tpl_var] = $var;

}else   {

exit('模板变量没有设好!');

}

}

//文件编译

public function display($file)  {

//模板文件

$tpl_file = $this->template_dir . '/' . $file;

if(!file_exists($tpl_file))   {

exit('Error: 模板文件不存在!');

}

//编译文件

$parse_file = $this->compile_dir . '/' . md5($file) . $file . '.php';

//只有当编译文件不存在或者是模板文件被修改过了

//才重新编译文件

if(!file_exists($parse_file) || filemtime($parse_file) < filemtime($tpl_file))   {

include_once('MiniSmarty_Compile.class.php');

$compile = new MiniSmarty_Compile($tpl_file);

$compile->parse($parse_file);

}

//开启了缓存才加载缓存文件,否则直接加载编译文件

if($this->caching)   {

//缓存文件

$cache_file = $this->cache_dir . '/' . md5($file) . $file . '.html';

//只有当缓存文件不存在,或者编译文件已被修改过

//重新生成缓存文件

if(!file_exists($cache_file) || filemtime($cache_file) < filemtime($parse_file))    {

//引入缓存文件

include_once($parse_file);

//缓存内容

$content = ob_get_clean();

//生成缓存文件

if(!file_put_contents($cache_file, $content))     {

exit('缓存文件生成出错!');

}

}

//载入缓存文件

include_once($cache_file);

}else   {

//载入编译文件

include_once($parse_file);

}

}

}

B.然后再新建一个MiniSmarty模板引擎解析器类文件:MiniSmarty_Compile.class.php

其代码如下:

<?php

// MiniSmarty模板引擎

class MiniSmarty_Compile {

//模板内容

private $content = '';

public function __construct($tpl_file)  {

$this->content = file_get_contents($tpl_file);

}

//解析普通变量,如把{$name}解析成$this->_tpl_var['name']

public function parseVar()  {

$pattern = '/\{\$([\w\d]+)\}/i';

if(preg_match($pattern, $this->content))   {

$this->content = preg_replace($pattern, '<?php echo \$this->_tpl_var["$1"]?>', $this->content);

}

}

//这里可以自定义其他解析器...

//模板编译

public function parse($parse_file)  {

//调用普通变量解析器

$this->parseVar();

//这里可以调用其他解析器...

//编译完成后,生成编译文件

if(!file_put_contents($parse_file, $this->content))   {

exit('编译出错!');

}

}

}

C.最后,还必须新建几个目录,分别是模板文件目录templates、编译文件目录 template_c、缓存文件目录cache。

D.编写demo.php,测试一下自定义的迷你版MiniSmarty模板引擎吧!

demo.php代码如下:

<?php

//引入模板引擎

require_once('MiniSmarty.class.php');

//实例化模板类

$minismarty = new MiniSmarty();

//缓存开关

//$minismarty->caching = true;

$webname = 'Smarty测试';

$author = 'lin3615';

$title = '这是测试标题';

$content = '这是测试内容';

$minismarty->assign('webname', $webname);

$minismarty->assign('author', $author);

$minismarty->assign('title', $title);

$minismarty->assign('content', $content);

//启动编译模板文件

$minismarty->display('demo.tpl');

demo.tpl 中示例如下:

{$webname}
<h3>{$title} </h3>
<span>作者:{$author}</span>
<p>内容:{$content}</p>

运行测试:可以修改上面的示例变量和是否开启缓存:

运行后,图如下:

迷你版 smarty --模板引擎和解析的更多相关文章

  1. 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)

    前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...

  2. smarty模板引擎原理解析

    //php 控制器文件 <?php//引入模板引擎文件include("20130304.php");$smarty =newTinySmarty();$qq_numbers ...

  3. Smarty模板引擎技术二

    Smarty模板引擎技术 内建函数 include_php内建函数 作用:载入一个php文件,将载入的文件的内容赋值给一个变量   注意:该内建函数只能在2.0中使用,如果使用的话,必须得实例化Sma ...

  4. Smarty模板引擎的使用

    Smarty模板引擎的使用 Smarty是PHP中一个基于MVC模式的模板引擎. Download: http://www.smarty.net/download   特点 1.  最快速度的程序开发 ...

  5. 前端学PHP之Smarty模板引擎

    前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...

  6. PHP之Smarty模板引擎

    前面的话 对PHP来说,有很多模板引擎可供选择,但Smarty是一个使用PHP编写出来的,是业界最著名.功能最强大的一种PHP模板引擎.Smarty像PHP一样拥有丰富的函数库,从统计字数到自动缩进. ...

  7. smarty模板引擎

    1.    使用smarty 1.1 项目引入 // 3, 连接数据库,提取相关数据 $title = "Smarty模板引擎"; $content = "Smarty模 ...

  8. 深入浅出之Smarty模板引擎工作机制(二)

    源代码下载地址:深入浅出之Smarty模板引擎工作机制 接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习,以便加深理解. Smarty模板引擎的原理,其实是这么一个过程: ...

  9. 深入浅出之Smarty模板引擎工作机制(一)

    深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解. ...

随机推荐

  1. SimpleDateFormat 转化毫秒到日期时,指定特定的时区

    http://blog.csdn.net/wangpeng047/article/details/8560690 影响TimeZone的因素: 1. 操作系统的时区设置. 2. 数据传输时时区设置. ...

  2. 树莓派通过 HDMI - VGA 转接后分辨率始终为640*480无法修改的问题

    一开始装的Raspbian,感觉系统不错,就是分辨率调不了,网上找了很多解决方法,捣鼓了差不多一天,仍然没有解决. 期间尝试换了好几个系统,比如说 raspbmc .XBian等,最后试了下Pidor ...

  3. 【Apache开源软件基金会项目】

    因为想要继续巩固一下外语,并且扩展下java的知识面,翻译一下Apache软件基金会的各个项目是个不错的选择. 2014-10-19 1 [Apache .NET Ant Libary] .net A ...

  4. 重要常用的Lunix命令

    lunix 命令大全:  http://man.linuxde.net/ 复制文件/文件夹 复制到本地 文件夹:scp -r work@www.abc.com:/home/work/project / ...

  5. AndroidAnnotations部署

    环境: 系统:windows 8 (64bit) 开发工具:Eclipse 3.8 JDK版本:jdk1.6 构建工具:Ant(Eclipse默认的build tool) androidannotat ...

  6. Java中字符流与字节流的区别

    字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单 ...

  7. IIS8无法调用Oracle.DataAccess .dll问题

    之前在.net平台下操作Oracle都是用的oracle.dataaccell.dll引用,但是服务器升级为II8后,发布的新服务有关Oracle数据库部分都无法运行,调试了好久发现是IIS8不支持低 ...

  8. HDU1518(dfs)java/ c++

    Square Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  9. 给TextView添加超链接的四种方式

    因为在上上篇博客中介绍了SpannableString的使用(SpannableString使用详解),由此想到给TextView添加超链接究竟有多少种方式?经过个人总结,现在一共发现四种,如果还有其 ...

  10. 这种写法用过没:string.Format("{0,-10}", 8)

    1 2 3 4 var s1 = string.Format("{0,-10}", 8); var s2 = string.Format("{0,10}", 8 ...