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

  Smarty模板引擎的原理,其实是这么一个过程:
  把模板文件编译成php文件,然后每次都去读取下模板的修改时间,没有修改就不编译。然后include这个“编译”后的PHP文件。
  所谓编译也就是模板用正则替换成含PHP代码的过程。
  实际上并不会每次请求都编译,所以性能尚可。

   模板文件和php程序文件经过模板引擎的编译后合成为一个文件,即编译后的文件。

接下来,我们根据该原理流程写一个简单的模板引擎。。。。。。

  先贴上核心代码:

  Smarty.class.php文件

<?php    class Smarty{        public $template_dir;//模板目录        public $compile_dir;//编译目录        public $arr=array();//定义一个数组,用以存放assign中的第二个参数传过来的值        public function __construct($template_dir="../templates",$compile_dir="../templates_c"){                $this->template_dir=$template_dir;//模板目录                $this->compile_dir=$compile_dir;  //编译目录            }        public function assign($content,$replacment=null){                if($content!=""){                 //如果指定模板变量,才将要赋的值存储到数组中                        $this->arr[$content]=$replacment;                    }            }        public function display($page){                $tplFile=$this->template_dir."/".$page;//读取模板文件,注意:如果模板目录下还有子目录,记得要写完整,比如,$smarty->display('Default/index.tpl')                if(!file_exists($tplFile)){                        return;                }                $comFile=$this->compile_dir."/"."com_".$page.".php";                $tplContent=$this->con_replace(file_get_contents($tplFile));//将smarty标签替换为php的标签                file_put_contents($comFile,$tplContent);                include $comFile;        }        public functioncon_replace($content){                $pattern=array(                    '/<{\s*\$([a-zA-Z_][a-zA-Z_0-9]*)\s*}>/i'                );                   $replacement=array(                       '<?php echo $this->arr["${1}"] ?>'                );                    return preg_replace($pattern,$replacement,$content);                }        }?>

Smarty.class.php代码解释:

    public function __construct($template_dir="../templates",$compile_dir="../templates_c")

    {

           $this->template_dir=$template_dir;

     $this->compile_dir=$compile_dir;

    }

    默认情况下,Smarty模板引擎将把templates目录用于存放模板文件,templates_c用于存放编译后的文件

  • assign($content,$replacment=null)函数的工作机制是将每次要传递给模板中的变量的值通过语句:$this->arr[$content]=$replacment;保存到数组中。  

    那为何要$replacement的值保存到数组中呢?

     其实内部操作是这么一个流程:将$replacement值保存到数组--->读取模板文件(index.dwt,由display函数完成)--->将数组中的值匹配给模板文件中的变量(由con_replace()函数完成)--->将替换后的模板文件写入到编译文件中(com_index.dwt.php)--->输出编译后的PHP文件

  • dispaly($page)函数接收一个参数,即要输出的模板文件(index.dwt)

    • 首先,将模板文件的路径赋给$tplFile($tplFile=$this->template_dir."/".$page)  
    • 判断模板文件是否存在,如果不存在,就没必要加载了,直接return
    • 指定一个编译文件,以便存放替换变量后的模板文件
    • 通过函数file_get_contents()读取模板文件,并通过函数conf_replace()替换掉模板中的smarty标签
    • 将替换变量后的模板文件通过file_put_contents()写入到编译文件中
    • 将编译后的文件include进来,即可输出编译后的文件
  • 函数con_replace($content)用于替换模板文件(index.dwt)中的变量,即将php中的变量值赋给模板中的变量    

    • 通过一个可以匹配<{$title}>形式的正则表达式匹配模板文件中的内容,并将匹配到的值替换为<?php echo $title?>的形式
    • 匹配到内容,并将替换后的内容返回
/*Smarty.ini.php文件:用于完成初始化smarty的工作*/<?php    include "./libs/Smarty.class.php";    $tpl=new Smarty();    $tpl->template_dir="./Tpl";        $tpl->compile_dir="./Compile";?>

<!--模板文件--><!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title><{$title}></title></head><body><p>内容:<{$content}></p><p>作者:<{$auth}></p><p>网址:<{$website}></p></body></html>

/*index.php文件*/<?php    include "./Smarty.ini.php";    $title="深入浅出之Smarty模板引擎工作机制";        $content="Smarty模板引擎工作机制流程图";    $auth="MarcoFly";    $website="www.MarcoFly.com";    $tpl->assign("title",$title);    $tpl->assign("content",$content);        $tpl->assign("auth",$auth);    $tpl->assign("website",$website);    $tpl->display("index.dwt");?>

该index.php就是PHP程序员编写的,可以从数据库中获取各种想要的数据,并保存到变量中,然后简单的调用assign()函数将数据保存到数组中,并通过display()函数将编译文件输出

注:此编译文件是php文件,通过服务器端执行,将结果输出的客户端的浏览器上

分析到这里,我们回过头来分析下在深入浅出之Smarty模板引擎工作机制(一)中给出的关于编译后的文件代码:

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title><?php echo $this->arr["title"] ?></title></head><body><p>内容:<?php echo $this->arr["content"] ?></p><p>作者:<?php echo $this->arr["auth"] ?></p><p>网址:<?php echo $this->arr["website"] ?></p></body></html>

由于我们已经通过assign()函数,将要赋给模板标签中变量的值保存到了数组中了,即此时编译后的模板文件,可以直接输出该数组中的值了。

举个例子:

$title="深入浅出之Smarty模板引擎工作机制";    
$tpl->assign("title",$title);
当执行了以上两句代码后,在数组$arr中就存放着下标为:title,值为:深入浅出之Smarty模板引擎工作机制的关联数组了。
此时,就可以直接通过$this->arr['title']直接输出该数组的值。
至于对如何从<{$title}>  ---> <?php echo $this->arr['title']?> 的转换,不懂的读者可以再仔细看下con_replace()函数。

有了以上几个文件之后,我们在浏览器中访问index.php文件将得到以下结果:

到此,我们“开发”了一个自己的模板引擎,并且测试成功,当然,这只是供交流学习之用。如果你觉得这篇文章对你了解smarty模板引擎的工作机制有所帮助的话,请帮忙顶一顶哈O(∩_∩)O~

文章出自:WEB开发_小飞

转载请注明出处:http://www.cnblogs.com/hongfei/archive/2011/12/10/Smarty-two.html

深入浅出之Smarty模板引擎工作机制(二)相关推荐

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

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

  2. Smarty模板引擎工作机制(二)

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

  3. Smarty模板引擎工作机制(一)

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

  4. 详解模板引擎工作机制

    本文讲的是详解模板引擎工作机制, 我已经使用各种模版引擎很久了,现在终于有时间研究一下模版引擎到底是如何工作的了. 简介 简单的说,模版引擎是一种可以用来完成涉及大量文本数据的编程任务的工具.一般而言 ...

  5. smarty模板引擎工作原理

    1.模板引擎是什么 展示给用户的页面由数据及承载数据的标签组成,标签就是html,而数据就是由php处理的变量,这样就涉及到了前端和后端的交互,模板引擎就是将php代码与html代码分离的技术. sm ...

  6. php模板缓存_Smarty模板引擎缓存机制详解

    本文实例讲述了Smarty模板引擎缓存机制.分享给大家供大家参考,具体如下: 首先说下smarty缓存和编译,这是两个不同的概念,编译默认情况下是启动的,而缓存机制需要人为开启,smarty编译过的文 ...

  7. Smarty模板引擎技术二

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

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

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

  9. cms概述 。比较shopex和ecshop区别 。smarty模板引擎的入门

    cms概述 为了找到一个合适的cms网站系统,我花了一番功夫搜索了多种cms,包括我用过的和没用过的,知道的和不知道的,当然,必须是开源的.免费的.生成静态页面的.到各自的官方网站,查看了有关资料,下 ...

最新文章

  1. Shell关于Wget命令的使用技巧
  2. 文计笔记1: 计算机基本原理
  3. mongodb morphia
  4. samba3.2的安装全过程(tar方式)
  5. C++之运算符重载(下)
  6. mysql 不指定 长度吗_mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...
  7. 漫步数理统计一——绪论
  8. 防止链接和二维码被微信拦截(被封锁、被屏蔽、被和谐)的最新方法——MaxJump
  9. Java第十九天:mysql(二)
  10. 复旦非全日制研究生计算机,信息整合!复旦大学非全日制研究生招生详情
  11. 【嵌入式Linux应用】初步移植MQTT到Ubuntu和Linux开发板
  12. 分享时刻—今日一收获
  13. 在国产处理器服务器上配置DNS 轮询,实现多台服务器务负载分担.
  14. 自动驾驶深度学习常用中英文对照表
  15. 容易被误解的overflow:hidden
  16. 古城罗马、佛洛伦萨、庞贝、比萨一览
  17. 一二线城市地王频出 供应加量能否房价“去火
  18. PAT_乙级1014
  19. 抖音短视频怎么做?3招带你玩转抖音
  20. android webview问题汇总

热门文章

  1. 大数据回顾2017年网络购物APP:渗透率从63.5%增长至69.9%
  2. BMP位图格式详解二--转载
  3. redis连接失败的两个解决办法
  4. 从你的头像,看出你的内心!
  5. 虫术 python绝技_虫术:Python绝技
  6. 编程语言未来发展趋势之我见
  7. **农商手机银行app更新代码后访问速度非常慢
  8. uni-app小程序实现视频压缩及上传
  9. jquery兄弟标签_jquery如何获取兄弟节点?
  10. 小米一元流量magisk_【magisk】【MIUI10】亲测解决MIUI一元流量root后无法使用问题...