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

  源代码下载地址:深入浅出之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 function con_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代码解释:

  $template_dir指定模板文件的目录

  $compile_dir指定编译后的模板文件的目录

  构造函数

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

本站原创内容,转载请注明来源:https://www.liutonghui.com/74

深入浅出之Smarty模板引擎工作机制(一)
上一篇 2014-08-18
CSS布局 ——从display,position, float属性谈起
下一篇 2014-09-05

评论列表(0条)

  • 暂无评论

发表评论

captcha

相关推荐

  • 一个迷你版Smarty模板引擎,认识模板引擎原理(附代码)

      前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎。今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是对模板引擎的原理,还是有深刻的理解的。如果有什么还需要改进的地方,记得提出来。   一、什么是Smarty模板引擎:   Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,......

    2013-11-19
    20520
  • 深入浅出之Smarty模板引擎工作机制(一)

      深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解。   在没有使用Smarty模板引擎的情况下,我们都是将PHP程序和网页模板合在一起编辑的,好比下面的源代码: &lt;?php $title="深处浅出之Smarty模板引擎工作机制"; $content="Smarty模板引擎原理流程......

    2014-08-18
    18170
  • PHP封装数据库操作Model类示例

      数据库操作是产品开发中最常见的需求,封装一个PHP数据库操作Model类可以减少反复的写大量SQL语句,下面就为大家分享一个数据库操作Model类。 &lt;?php //引入配置文件 include "./config.php"; class Model { public $link;//存储连接对象 public $tableName = "";//存储表名 public $field =......

    2019-06-12
    21024
  • ThinkPHP数据库操作(Db)与模型操作(Model)区别

      Db类数据操作:性能略高一些,语法简单直观,但是不支持自动处理数据,自动验证,关联查询等功能,适合简单数据操作。 use think\facade\Db; // 查询 Db::table('user')-&gt;where('id', 1)-&gt;find(); // 新增 Db::table('user')-&gt;insert([ 'name' =&gt; '张三', 'age' =&gt; 20 ]); ......

    2019-12-02
    18300
  • TinyMCE插入代码块强制显示行号

      TinyMCE自带codesample插入代码功能不支持行号,需要依靠Prism.js行号插件实现。在编辑器插入代码会生成如下代码: &lt;pre class="line-numbers language-javascript"&gt; &lt;code&gt; 代码内容 &lt;/code&gt; &lt;/pre&gt;   注意:class里的line-numbers类有时会没有自己加上,导致前台不显示行号,可能是个......

    2023-03-20
    12070
  • 日乒一姐石川佳纯退役

      石川佳纯于5月18日在东京举行了退役发布会,结束了她23年的乒乓球运动生涯。在发布会上,她还用中文向中国球迷表达了感谢,表示在中国比赛时有主场感觉,并感激中国球迷一直以来的支持。石川佳纯是日本著名乒乓球运动员,1993年2月23日出生于日本山口县,7岁开始打球,13岁被称为天才少女,在她最美好的青春年华,驰骋在乒乓球赛场上,为梦想付出行动。   作为日本女子乒坛的领军人物,石川佳纯以清纯的面容和高超的球技闻名于乒乓球界,在日本国内......

    2023-05-18
    12350
  • 刀郎新歌《罗刹海市》引发轰动

      刀郎的新歌《罗刹海市》最近引起了轰动,但这次不是因为它的音乐本身有多么好听或传唱度有多高,而是因为歌词被许多网友解读为内涵了那英、汪峰、杨坤和高晓松等名人,引发了广泛的兴趣和热议。   歌词中的一些词汇和意象被认为与这些名人的特点和经历有关,网友们纷纷展开联想,将歌词与这些名人一一对应起来。那英被指歌词中&ldquo;那又鸟&rdquo;所指,杨坤被描述为&ldquo;马户&rdquo;,高晓松被称为&ldquo;拿扇子的公公&r......

    2023-08-03
    11800
  • FC游戏网九岁了

      FC游戏网今天成立九年整了,回望过去,我深感欣慰,展望未来,我充满信心。一路走来,经历过困难和挫折,也有过成功后的喜悦,我相信一分耕耘就会有一分收获。感谢这个时代带来的机遇,祝福所有对梦想坚守和对生活热爱的人。 ......

    2024-01-01
    8260