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

所谓编译也就是模板用正则替换成含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;
                if(!file_exists($tplFile)){
                        return;
                }
                $comFile=$this->compile_dir."/"."com_".$page.".php";
                $tplContent=$this->con_replace(file_get_contents($tplFile));
                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)--->将数组中的值匹配给模板文件中的变量(由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文件,通过服务器端执行,将结果输出的客户端的浏览器上

时间: 2024-10-25 01:34:04

php Smarty模板引擎工作机制(二)的相关文章

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

源代码下载地址:深入浅出之Smarty模板引擎工作机制 接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习,以便加深理解.   Smarty模板引擎的原理,其实是这么一个过程: 把模板文件编译成php文件,然后每次都去读取下模板的修改时间,没有修改就不编译.然后include这个"编译"后的PHP文件. 所谓编译也就是模板用正则替换成含PHP代码的过程. 实际上并不会每次请求都编译,所以性能尚可.  模板文件和php程序文件经过模板引擎的编译后合成为一个文件,

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

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

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

在没有使用Smarty模板引擎的情况下,我们都是将PHP程序和网页模板合在一起编辑的,好比下面的源代码:  代码如下 复制代码 <?php $title="深处浅出之Smarty模板引擎工作机制"; $content="Smarty模板引擎原理流程图"; $auth="MarcoFly"; $website="www.111cn.net"; ?> <!DOCTYPE HTML> <html>

详解模板引擎工作机制

本文讲的是详解模板引擎工作机制, 我已经使用各种模版引擎很久了,现在终于有时间研究一下模版引擎到底是如何工作的了. 简介 简单的说,模版引擎是一种可以用来完成涉及大量文本数据的编程任务的工具.一般而言,我们经常在一个 web 应用中利用模板引擎来生成 HTML .在 Python 中,当你想使用模板引擎的时候,你会发现你有不少的选择,比如jinja 或者是mako.从现在开始,我们将利用 tornado 中的模板引擎来讲解模板引擎的工作原理,在 tornado 中,自带的模板引擎相对的简单,能方

Smarty模板引擎缓存机制详解_php实例

本文实例讲述了Smarty模板引擎缓存机制.分享给大家供大家参考,具体如下: 首先说下smarty缓存和编译,这是两个不同的概念,编译默认情况下是启动的,而缓存机制需要人为开启,smarty编译过的文件还是php文件,所以执行的时候还是编译的,如果涉及到数据库,还是要访问数据库的所以开销也不小啦,所以需要smarty缓存来解决! 1.开启全局缓存 $smarty->cache_dir = "/caches/"; //缓存目录 $smarty->caching = true;

Smarty模板引擎缓存机制详解

本文实例讲述了Smarty模板引擎缓存机制.分享给大家供大家参考,具体如下: 首先说下smarty缓存和编译,这是两个不同的概念,编译默认情况下是启动的,而缓存机制需要人为开启,smarty编译过的文件还是php文件,所以执行的时候还是编译的,如果涉及到数据库,还是要访问数据库的所以开销也不小啦,所以需要smarty缓存来解决! 1.开启全局缓存 $smarty->cache_dir = "/caches/"; //缓存目录 $smarty->caching = true;

Javascript 引擎工作机制详解_javascript技巧

Javascript 引擎工作机制 javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之前,我们需要引入几个相关的概念:执行环境栈.全局对象.执行环境.变量对象.活动对象.作用域和作用域链等,这些概念正是JS引擎工作的核心组件.这篇文章的目的不是孤立的为你讲解每一个概念,而是通过一个简单的demo来展开分析,全局讲解JS引擎从定义到执行的每一个细节,以及这些概念在其中所扮演的角色. var x = 1; //定义一个全局变量 x function A

smarty模板引擎之分配数据类型

 这篇文章主要介绍了smarty模板引擎之分配数据类型,实例分析了smarty模板引擎数据类型的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了smarty模板引擎之分配数据类型用法.分享给大家供大家参考.具体分析如下: 一.分配基本数据 ? 1 2 3 4 5 6 7 8 9 10 11 //分配基本数据 $smarty->assign("str","hello smarty!"); $smarty->assign(&quo

smarty模板引擎之配置文件数据和保留数据

 这篇文章主要介绍了smarty模板引擎之配置文件数据和保留数据的方法,实例分析了smarty模板引擎配置文件数据及获取数据的具体技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了smarty模板引擎之配置文件数据和保留数据的方法.分享给大家供大家参考.具体如下: 一.如何让模板直接从配置文件中取出数据 1.使用场合 当某个变量值,不希望直接写死到程序中(通过smarty分配),就可以通过配置文件来获取. 2.写配置文件 新建文件夹:config 新建文件名:my.ini或