<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
<title><![CDATA[PHP开发园地]]></title>
<link><![CDATA[http://www.itivy.com/php]]></link>
<description><![CDATA[做一个勇于分享的php园丁]]></description>
<language><![CDATA[zh-cn]]></language>
<copyright><![CDATA[]]></copyright>
<webMaster><![CDATA[]]></webMaster>
<generator><![CDATA[]]></generator>
<Image><![CDATA[]]></Image>
<item>
<link><![CDATA[http://www.itivy.com/php/archive/2011/12/13/php-smarty-template-engine-1.html]]></link>
<title><![CDATA[浅谈Smarty模板引擎工作机制(一)]]></title>
<author><![CDATA[php园丁]]></author>
<category><![CDATA[]]></category>
<pubDate>Tue, 13 Dec 2011 22:16:54 GMT</pubDate>
<guid><![CDATA[]]></guid>
<description><![CDATA[<p><strong>深入浅出Smarty模板引擎工作机制</strong>，我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别，并动手开发一个自己的模板引擎，以便加深对smarty模板引擎工作机制的理解。</p>
<p>在没有使用Smarty模板引擎的情况下，我们都是将PHP程序和网页模板合在一起编辑的，好比下面的源代码：</p>
<p></p>
<pre class="brush:php;">&lt;?php
$title="深处浅出之Smarty模板引擎工作机制";
$content="Smarty模板引擎原理流程图";
$auth="MarcoFly";
$website="www.MarcoFly.com";
?&gt;
&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
&lt;title&gt;&lt;?php echo $title?&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;内容：&lt;?php echo $content?&gt;&lt;/p&gt;
&lt;p&gt;作者:&lt;?php echo $auth?&gt;&lt;/p&gt;
&lt;p&gt;网址：&lt;?php echo $website?&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>输出到浏览器的结果截图：<p></p>
<p><img src="/Upload/EditorImage/image/php/201112/20111213220218_2420.jpg" alt="" border="0" /></p>
<p>查看HTML源代码：</p>
<p></p>
<pre class="brush:xhtml;">&lt;!DOCTYPE HTML&gt;

&lt;html&gt;

&lt;head&gt;

&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;

&lt;title&gt;深处浅出之Smarty模板引擎工作机制&lt;/title&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;p&gt;内容：Smarty模板引擎原理流程图&lt;/p&gt;

&lt;p&gt;作者:MarcoFly&lt;/p&gt;

&lt;p&gt;网址：www.MarcoFly.com&lt;/p&gt;

&lt;/body&gt;

&lt;/html&gt;</pre><p></p>
<p>程序比较小的情况下这种开发方式尚且不方便，一旦要开发一个大的WEB项目，就必须得使用到模板引擎。<br />
使用模板引擎的情况下：<br />
我们的开发方式将有所改变，美工人员只管做模板，后台开发人员专心写自己的程序。<br />
一个web项目就可以分为模板文件和PHP程序了<br />
比如：<br />
美工人员就可以这样编辑网页模板文件：<br />
index.dwt源代码</p>
<p></p>
<pre class="brush:xhtml;">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
&lt;title&gt;&lt;{$title}&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;内容：&lt;{$content}&gt;&lt;/p&gt;
&lt;p&gt;作者：&lt;{$auth}&gt;&lt;/p&gt;
&lt;p&gt;网址:&lt;{$website}&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>而后台WEB开发人员可以专注于PHP代码的书写：<br />
index.php<p></p>
<p></p>
<pre class="brush:bash;">&lt;?php
    include "./Smarty.ini.php";
    $title="深处浅出之Smarty模板引擎工作机制";    

    $content="Smarty模板引擎工作机制流程图";
    $auth="MarcoFly";
    $website="www.MarcoFly.com";
    $tpl-&gt;assign("title",$title);
    $tpl-&gt;assign("content",$content);    
    $tpl-&gt;assign("auth",$auth);
    $tpl-&gt;assign("website",$website);
    $tpl-&gt;display("index.dwt");
?&gt;</pre><p>从以上两段简单的演示代码可以看出，前台模板文件没有涉及到任何关于PHP的代码，只有几个看似陌生的标签&lt;{$title}&gt;和&lt;{$content}&gt;,而后台的php程序代码也没有涉及到前台的HMTL代码</p>
<p>参考下图对比这两种开发方式的区别</p>
<p><img src="/Upload/EditorImage/image/php/201112/20111213220535_7549.gif" alt="" border="0" /></p>
<p>通过对比，我们得出结论：在使用模板引擎后，原先需要使用PHP编写的地方，现在只需要用模板引擎提供标签的形式来代替了。</p>
<p>注：Smarty模板引擎默认的标签形式是{$xxx}，如，{$title},{$content}</p>
<p>当然我们可以初始化为自己想要的标签形式，如我将其初始化为:&lt;{$xxx}&gt;的形式),如，&lt;{$title}&gt;、&lt;{$content}&gt;</p>
<p>不知各位看官有木有觉得奇怪，&lt;{$title}&gt;、&lt;{$content}&gt;根本就不是PHP的语法形式，那最终又是如何被输出到客户的浏览器中的，是否另有玄机？带着这个疑问，我们继续深究......</p>
<p>其实，这一切的一切都是由Smarty模板引擎这双神秘的手在“暗中操作”着，经过Smarty模板引擎的“暗中操作”之后，起初的模板文件(index.dwt)经过Smarty“成功手术”之后，被改造为能在服务器端执行的PHP代码文件。</p>
<p>想看看模板文件(index.dwt)和后台的PHP程序(index.php)经过“手术”(即编译)之后的庐山真面目吗？</p>
<p>在此贴上经过模板引擎编译之后的编译文件的源代码：</p>
<p></p>
<pre class="brush:xhtml;">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
&lt;title&gt;&lt;?php echo $this-&gt;arr["title"] ?&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;内容：&lt;?php echo $this-&gt;arr["content"] ?&gt;&lt;/p&gt;
&lt;p&gt;作者：&lt;?php echo $this-&gt;arr["auth"] ?&gt;&lt;/p&gt;
&lt;p&gt;网址:&lt;?php echo $this-&gt;arr["website"] ?&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>看到这里，各位看官是否恍然大悟，原来Smarty模板引擎的工作就是：将前台美工人员编写的模板文件(index.dwt)和后台开发人员编写的PHP程序(index.php)整合在一起，经过编译这一步骤之后，原先的模板标签被替换成了php代码。<p></p>
<p>为了方便大家理解，我简单的做了一张代码流程图：</p>
<p><img src="/Upload/EditorImage/image/php/201112/20111213220725_6108.gif" alt="" border="0" /></p>
<p>如果你觉得很神秘，想更深入了解Smarty模板引擎是如何完成这一步骤的，可以看看<a target="_blank" href="http://www.itivy.com/php/archive/2011/12/13/php-smarty-template-engine-2.html">深入浅出之Smarty模板引擎工作机制(二)</a></p>
<p>原文链接：http://www.cnblogs.com/hongfei/archive/2011/12/10/Smarty-one.html</p>]]></description>
</item>

<item>
<link><![CDATA[http://www.itivy.com/php/archive/2011/12/13/php-smarty-template-engine-2.html]]></link>
<title><![CDATA[浅谈Smarty模板引擎工作机制(二)]]></title>
<author><![CDATA[php园丁]]></author>
<category><![CDATA[]]></category>
<pubDate>Tue, 13 Dec 2011 22:16:21 GMT</pubDate>
<guid><![CDATA[]]></guid>
<description><![CDATA[<p><span style="font-family:monospace;">源代码下载地址：<a target="_blank" href="http://download.csdn.net/detail/php_fly/3905519">深入浅出之Smarty模板引擎工作机制</a></span></p>
<p><span style="font-family:monospace;">接下来根据以下的Smarty模板引擎原理流程图开发一个自己的模板引擎用于学习，以便加深理解。</span></p>
<p><span style="font-family:monospace;"><img src="/Upload/EditorImage/image/php/201112/20111213221201_2645.gif" alt="" border="0" /></span></p>
<p><span style="font-family:monospace;">Smarty模板引擎的原理，其实是这么一个过程：<br />
　　把模板文件编译成php文件，然后每次都去读取下模板的修改时间，没有修改就不编译。然后include这个“编译”后的PHP文件。<br />
　　所谓编译也就是模板用正则替换成含PHP代码的过程。<br />
　　实际上并不会每次请求都编译，所以性能尚可。<br />
　　模板文件和php程序文件经过模板引擎的编译后合成为一个文件，即编译后的文件。<br />
<br />
接下来，我们根据该原理流程写一个简单的模板引擎。。。。。。<br />
　　先贴上核心代码：<br />
</span></p>
<p><span style="font-family:monospace;">　　Smarty.class.php文件<span style="font-family:&quot;sans serif&quot;,tahoma,verdana,helvetica;"><br />
</span></span></p>
<p></p>
<pre class="brush:php;">&lt;?php
    class Smarty{
        public $template_dir;//模板目录
        public $compile_dir;//编译目录
        public $arr=array();//定义一个数组，用以存放assign中的第二个参数传过来的值
        public function __construct($template_dir="../templates",$compile_dir="../templates_c"){            
                $this-&gt;template_dir=$template_dir;
                $this-&gt;compile_dir=$compile_dir;
            }
        public function assign($content,$replacment=null){
                if($content!=""){                    //如果指定模板变量，才将要赋的值存储到数组中
                        $this-&gt;arr[$content]=$replacment;
                    }
            }    
        public function display($page){
                $tplFile=$this-&gt;template_dir."/".$page;
                if(!file_exists($tplFile)){
                        return;
                }
                $comFile=$this-&gt;compile_dir."/"."com_".$page.".php";
                $tplContent=$this-&gt;con_replace(file_get_contents($tplFile));
                file_put_contents($comFile,$tplContent);
                include $comFile;            
        }
        public function con_replace($content){
                $pattern=array(
                    '/&lt;{\s*\$([a-zA-Z_][a-zA-Z_0-9]*)\s*}&gt;/i'
                );
                   $replacement=array(
                       '&lt;?php echo $this-&gt;arr["${1}"] ?&gt;'
                );
                    return preg_replace($pattern,$replacement,$content);
                }
        }
?&gt;</pre><p></p>
<p><strong>Smarty.class.php</strong><strong>代码解释：</strong></p>
<ul><li>$template_dir&nbsp; 指定模板文件的目录</li>
<li>$compile_dir&nbsp;&nbsp; 指定编译后的模板文件的目录</li>
<li>构造函数&nbsp;</li>
</ul>
<p>　　　　public function __construct($template_dir="../templates",$compile_dir="../templates_c")</p>
<p>　　　　{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　$this-&gt;template_dir=$template_dir;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　　　 $this-&gt;compile_dir=$compile_dir;</p>
<p>　　　　}</p>
<p>　　　　默认情况下，Smarty模板引擎将把templates目录用于存放模板文件，templates_c用于存放编译后的文件</p>
<div>
<p>&nbsp;</p>
<ul><li>assign($content,$replacment=null)函数的工作机制是将每次要传递给模板中的变量的值通过语句：$this-&gt;arr[$content]=$replacment;保存到数组中。　　</li>
</ul>
</div>
<p>那为何要$replacement的值保存到数组中呢？</p>
<p>其实内部操作是这么一个流程：将<strong>$replacement值保存到数组---&gt;读取模板文件
(index.dwt)---&gt;将数组中的值匹配给模板文件中的变量(由con_replace()函数完成)---&gt;将替换后的模板文件写
入到编译文件中(com_index.dwt.php)---&gt;输出编译后的PHP文件</strong></p>
<ul><li>dispaly($page)函数接收一个参数，即要输出的模板文件(index.dwt)<ul><li>首先，将模板文件的路径赋给$tplFile($tplFile=$this-&gt;template_dir."/".$page)　　</li>
<li>判断模板文件是否存在，如果不存在，就没必要加载了，直接return</li>
<li>指定一个编译文件，以便存放替换变量后的模板文件</li>
<li>通过函数file_get_contents()读取模板文件，并通过函数conf_replace()替换掉模板中的smarty标签</li>
<li>将替换变量后的模板文件通过file_put_contents()写入到编译文件中</li>
<li>将编译后的文件include进来，即可输出编译后的文件</li>
</ul>
</li>
</ul>
<ul><li>函数con_replace($content)用于替换模板文件(index.dwt)中的变量，即将php中的变量值赋给模板中的变量　　　　<ul><li>通过一个可以匹配&lt;{$title}&gt;形式的正则表达式匹配模板文件中的内容，并将匹配到的值替换为&lt;?php echo $title?&gt;的形式</li>
<li>匹配到内容，并将替换后的内容返回</li>
</ul>
</li>
</ul>
<p></p>
<pre class="brush:php;">/*Smarty.ini.php文件:用于完成初始化smarty的工作*/
&lt;?php
    include "./libs/Smarty.class.php";
    $tpl=new Smarty();
    $tpl-&gt;template_dir="./Tpl";    
    $tpl-&gt;compile_dir="./Compile";
?&gt;</pre><pre class="brush:xhtml;">&lt;!--模板文件--&gt;
&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
&lt;title&gt;&lt;{$title}&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;内容：&lt;{$content}&gt;&lt;/p&gt;
&lt;p&gt;作者：&lt;{$auth}&gt;&lt;/p&gt;
&lt;p&gt;网址:&lt;{$website}&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><pre class="brush:php;">/*index.php文件*/
&lt;?php
    include "./Smarty.ini.php";
    $title="深入浅出之Smarty模板引擎工作机制";    
    $content="Smarty模板引擎工作机制流程图";
    $auth="MarcoFly";
    $website="www.MarcoFly.com";
    $tpl-&gt;assign("title",$title);
    $tpl-&gt;assign("content",$content);    
    $tpl-&gt;assign("auth",$auth);
    $tpl-&gt;assign("website",$website);
    $tpl-&gt;display("index.dwt");
?&gt;</pre><p></p>
<p>该index.php就是PHP程序员编写的，可以从数据库中获取各种想要的数据，并保存到变量中，然后简单的调用assign()函数将数据保存到数组中，并通过display()函数将编译文件输出</p>
<p>注：此编译文件是php文件，通过服务器端执行，将结果输出的客户端的浏览器上</p>
<hr />
<p>有了以上几个文件之后，我们在浏览器中访问index.php文件将得到以下结果：</p>
<p><img src="/Upload/EditorImage/image/php/201112/20111213221516_0942.jpg" alt="" border="0" /></p>
<p>原文链接：http://www.cnblogs.com/hongfei/archive/2011/12/10/Smarty-two.html</p>]]></description>
</item>


</channel>
</rss>

