陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现

描述: smarty模板技术为PHP程序设计中处理和界面的分离提供了很大的便利,有必要了解其设计思路和底层机制,本文设计了一个简单的仿Smarty模板,方便贵阳网站建设人员加深对smarty模板处理机制的了解。陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现

一、smarty模板技术好处
    比如有要求如下:要显示标题和内容,可能需要从数据库中取值。
    在统计模式下,没有使用模板技术时,intro.php代码如下:
<?php
    $title=”我的文章标签”;
    $content=”我的文章内容”;
      //如果这个两个数据是从数据库,则需要建立数据库链接,更增加了贵阳网站建设人员对PHP的掌握难度。如果程序员是前台开发人员,让他去研究PHP编程,可能不是理想的结构吧。
   //mysql_connect ....
?>
<html>
<head><title><?php echo $title;></title></head>
<body>
<?php echo $content;?>//要有PHP程序设计代码完成显示功能。
</body>
</html>
    显示的问题虽然解决了,但存在一些问题:php脚本代码和界面(html/css/js)混合, 界面不简洁; 编写php页面要求贵阳网站建设程序员不但会php编程,同时还要会网页设计技术。不利于项目的分工协作开发。
    所以,通过模板技术来解决是很好的模式。模板引擎技术的核心思想就是:数据(通过php业务代码获取)和界面显示分离,同时理解这点也是我们透彻掌握smarty技术的关键, 现在我们用模板引擎技术来解决上面的问题。本文介绍怎样编写自己的模板引擎,透彻理解模板引擎技术。
    现在希望将显示部分“$title=”我的文章标签”;    $content=”我的文章内容”;”和数据分离。因此,把上面代码分成两个部分。一个是模板文件intro.tpl,另一个是:
intro.tpl源代码: 
<html>
<head><title>{%title}></title></head>
<body>
{%content}//通过占位符来识别。待用实际内容来填充。
</body>
</html>
    再设计一个为intro.tpl这个模板提供数据(占位符部分需要的数据)的控制器文件intro.php,这部分为真正的PHP文件,要使用模板技术来替换模板中占位符的内容。为其分配需要的数据。相当于前节(《一步一步跟我学PHP》第51讲:PHP中smarty模板技术介绍, http://www.by-sj.com/WebRes/Pro787.html)显示员工列表例子中的smarty部分,现在我们设计一个自己的模板来实现这个功能。在此取名为MyMiniSmarty.class.php。
    在Apache的htdocs目录(方便调试)中建一个目录Mysmarty。建文件intro.tpl,其内容如下面代码。
    再建一个intro.php待用,是处理界面请求的PHP文件。建一个MyMiniSmarty.class.php文件,是自定义的模板核心文件。程序运行时,系统自动用包括数据的代码替换模板中的占位符部分的代码。此时的代码才是真正可以运行的,之前的模板文件是不能直接解析的,所以具有一定的安全性。Smarty的工作就是将模板文件读入,处理成可以运行的文件再输出到编译的目录中,是服务器真正执行的文件。其代码如下:
<?PHP
    class MyMiniSmarty{
    //成员属性:定义三个:模板路径、编译路径,
    var $template_dir="./templates/";//模板文件路径,public和Var都表示公开,兼容性更好,低版本的也支持。
     var $complic_dir="./templates_c/";//模板文件被编译后的文件路径。
 //产生一个编译后的文件名称。放到templates_c目录中。
 $complie_file_path-$this->complic_dir."com_".$tpl_file.".php";
       Var $tpl_vars=array();//用于缓存数组的变量值。
      //定义方法
       Function assign($tpl_var,$val=null){
          If($tpl_var!=’’){
            $this->tpl_vars[$tpl_val]=$val;
}
}
//这里要编写display方法。调用时只需要一个模板文件。
Function display($tpl_file){
 //要读取模板文件内容并处理,把占位符替换成可以运行的代码,生成编译后文件。
   $tpl_file_path=$this->template_dir.$tpl_file;
   //判断文件是否存在。存在时候再读。
   If(!file_exists($tpl_file_path)){
  Return false;
}
   if (!file_exists($complie_file_path)||filemtime($tpl_file_path)>filemtime($complie_file_path)){
$fpl_file_con=file_get_contents($tpl_file_path);//读取文件内容
//下面要实现替换功能。需要有相关的正则表达式的知识。实习这些知识见下面的内容。
Echo “OK”;//$fpl_file_con;//显示出文件的原始内容
//测试本段代码是否正确执行。
//先在mysmarty目录中建一个templates目录,并把intro.tpl文件移动到此目录中。再建一个templates_c,用于存放编译后文件。
//在intro.php文件中增加代码如下:
//Require_once(“MyMiniSmarty.class.php”);
//$mysmarty=new myMinismarty();//实例化
//$mysmarty->assign(“title”,”我的第一个文件title”);
//$mysmarty->assign(“content”,”我的第一个文件内容”);
//$mysmarty->display(“intro.tpl”);
//运行intro.php即可显示”OK”;的内容,表示正常。下面就需要补一下正则表达式的内容咯。
//*************************************************
//****************************************************************
 //读取模板文件intro.tpl后,进行处理
 //下处理title后的空格等问题
 $pattern=array(
   '/\{\s*\$([a-zA-Z_][a-zA-Z0-9_]*)\s*\}/i'
  );
  //\{转意,表示{   \s表示批配任何空白字符,从语法严格性方法要放宽,所以要处理title前面空格和后面空格问题
  //([a-zA-Z_][a-zA-Z0-9_]*) 表示$符后的字符,可以以字母和下划线开头,后面的字符可以是字母或者数字或者下划线。可以有多个
  //替换成下面的串。要注意应用音引号,如果是双引号时表示里面的$要被执行。会出问题。
 $replace=array(
 '<?php echo $this->tpl_Vars["${1}"] ?>'
 );
 //${1}表示找到的第一个子表达式的内容,如找到1234则为:<?php echo $this->tpl["1234"]
 $newstr=preg_replace($pattern,$replace,$tpl_file_con);
 echo $newstr;
 //保存文件
 file_put_contents($complie_file_path,$newstr);
  //引入编译后的文件
}  //结束重复生成的判断
    include $complie_file_path;
//***************************************************8
}
 }
?>
文件执行后,正确显示:
<html>
<head><title>我的第一个文件title</title></head>
<body>
我的第一个文件内容</body>
</html>

可以通过分配颜色等方式进行轻松修改。
    比如分配时可以:
    $mysmarty->assign("content","<font color=’red’>我的第一个文件内容</font>");
    到此,自定义的smarty模板设计完成,但在效率是要作文件生成处理,不可以有访问就重新生成文章。要进行模板修改时间和编译文件的修改时间的判断。
   if (!file_exists($complie_file_path)||filemtime($tpl_file_path)>filemtime($complie_file_path)){

}

二、正则表达式
    PHP中如何使用正则表达式。打开PHP手册,在函数中找到PCRE涵数,了解preg_replace函数。
preg_replace函数用于执行一个正则表达式的搜索和替换。格式:mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
例子:
<?PHP
//怎样以PHP中使用正则表达式
$str="1234kfldsadf1;sakfd;9000lafkj;lsakf;lsa8900";
//要求把四个数替换成张三。
$pattern="/\d\d\d\d/i";//表示四个连续的数
$newstr=preg_replace($pattern,"张三",$str);
echo $newstr;//显示结果为:张三kfldsadf1;sakfd;张三lafkj;lsakf;lsa张三,表示替换成功。
?>
    此例子无法满足本例子的要求。
    例子2://要求是把四个数替换成<?php echo $this->tpl['1234']? >即替换后内容为:
//<?php echo $this->tpl['1234']? >kfldsadf1;sakfd;<?php echo $this->tpl['900']? >lafkj;lsakf;lsa<?php echo $this->tpl['8900']? >
在preg_replace中,pattern参数表示要搜索的模式. 可以使一个字符串或字符串数组。
    Replacement参数也可以是用于替换的字符串或字符串数组. 如果这个参数是一个字符串, 并且pattern 是一个数组, 那么所有的模式都使用这个字符串进行替换. 如果pattern和replacement 都是数组, 每个pattern使用replacement中对应的 元素进行替换. 如果replacement中的元素比pattern中的少, 多出来的pattern使用空字符串进行替换。
例子代码:
<?PHP
$str="1234kfldsadf1;sakfd;9000lafkj;lsakf;lsa8900";
//要求把四个数替换成张三。
$pattern=array(
  '/(\d\d\d\d)/i'
 );
$replace=array(
'<?php echo $this->tpl["${1}"] ?>'
);
//${1}表示找到的第一个子表达式的内容,如找到1234则为:<?php echo $this->tpl["1234"]
$newstr1=preg_replace($pattern,$replace,$str);
echo $newstr1;
?>
输出后的源代码为:
<?php echo $this->tpl["1234"] ?>kfldsadf1;sakfd;<?php echo $this->tpl["9000"] ?>lafkj;lsakf;lsa<?php echo $this->tpl["8900"] ?>
    下面要结合上例来进行替换。即要把如下intro.tpl模板代码进行替换:
<html>
<head><title>{%title}></title></head>
<body>
{%content}//通过占位符来识别。待用实际内容来填充。
</body>
</html>
针对这个文件来操作。
<?PHP
//读取模板文件intro.tpl
$tpl_file_con=file_get_contents("./templates/intro.tpl");
//下处理title后的空格等问题
$pattern=array(
  '/\{\s*\$([a-zA-Z_][a-zA-Z0-9_]*)\s*\}/i'
 );
 //\{转意,表示{   \s表示批配任何空白字符,从语法严格性方法要放宽,所以要处理title前面空格和后面空格问题
 //([a-zA-Z_][a-zA-Z0-9_]*) 表示$符后的字符,可以以字母和下划线开头,后面的字符可以是字母或者数字或者下划线。可以有多个
 //替换成下面的串。要注意应用音引号,如果是双引号时表示里面的$要被执行。会出问题。
$replace=array(
'<?php echo $this->tpl_Vars["${1}"] ?>'
);
//${1}表示找到的第一个子表达式的内容,如找到1234则为:<?php echo $this->tpl["1234"]
$newstr=preg_replace($pattern,$replace,$tpl_file_con);
echo $newstr;
//保存文件
file_put_contents("./templates_c/com_intro.tpl.php",$newstr);
echo "OK";
?>

【推荐阅读】陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现

陈力:传智播客古代 珍宝币 泡泡龙游戏开发第52讲:PHP仿smarty模板的实现相关推荐

  1. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第54讲:PHP smarty模板内建函数

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第54讲:PHP smarty模板内建函数 描述: smarty模板技术为PHP程序设计中处理和界面的分离提供了很大的便利,有必要了解内建函数等方面的内容,方 ...

  2. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第53讲:PHP smarty模板配置及变量操作

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第53讲:PHP smarty模板配置及变量操作 描述: smarty模板技术为PHP程序设计中处理和界面的分离提供了很大的便利.如果分配整型.小数.布尔型. ...

  3. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第35讲:PHP 抽象类与接口

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第35讲:PHP 抽象类与接口 如果一个类使用abstract 来修饰,则该类就是抽象类.抽象方法是声明为abstract的,是不需要实现的,供子类继承且实现 ...

  4. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第22讲:PHP语法、数据类型(整型、布尔型、浮点型、字符串型)

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第22讲:PHP语法.数据类型(整型.布尔型.浮点型.字符串型) PHP语法是什么样的,有哪些数据类型,有些什么变量.本文对PHP语法.数据类型(整型.布尔型 ...

  5. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第48讲:PHP绘图技术

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第48讲:PHP绘图技术 php绘图坐标体系中,坐标原点位于左上角,以像素为单位.php绘图时,要创建画布.画出各种图形.输出图形.销毁图形(释放内存资源). ...

  6. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第26讲:PHP函数

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第26讲:PHP函数 什么是PHP函数,如何通过function定义一个函数,如何理解函数的调用过程.这些问题都是网站建设中经常遇到的程序设计问题.在进行网站 ...

  7. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第28讲:PHP数组

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第28讲:PHP数组 PHP程序设计语言中的数组如何创建,一维数组的引用,PHP数组变量,foreach语句,如何对数组进行排序等等知识都是贵阳网站建设中的主 ...

  8. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第30讲:PHP多维数组

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第30讲:PHP多维数组 在PHP程序设计语言中,如何创建二维数组呢,怎样使用二维数组,这些问题在网站建设中非常重要.二维数组的基本语法为: $a=array ...

  9. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第50讲:PHP中的xml编程

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第50讲:PHP中的xml编程 Xml是extensiable markup language的简称,包括文档声明.元素.属性.注释.CDATA区.特殊字符 ...

最新文章

  1. 网易云音乐的消息队列改造之路
  2. 13 款惊艳的 Node.js 框架——第1部分
  3. 初中计算机应用教什么,信息技术在初中数学教学中的应用
  4. 单页面应用微信分享跳坑指南
  5. fuse的API修改
  6. 基于 KIF 的 iOS UI 自动化测试和持续集成
  7. C-order/Fortran-order(Row-/Column-major order)
  8. DRBD详细解说及配置过程记录
  9. C语言程序设计(第2版)课后答案
  10. 四十一、SPSS中的t检验和卡方检验
  11. SAP ABAP内表OCCURS,WORK AREA等 语法对比!
  12. 商务个人邮箱如何注册申请?商务邮箱账号怎么登录?
  13. 2021会宁三中高考成绩查询,会宁机电工业学校2021年招生录取分数线
  14. XFTP软件连接虚拟机
  15. 母牛问题c语言程序,C语言-母牛和兔子的问题
  16. vue 模式下js微信支付
  17. 博客鼠标特效代码|鼠标特效代码
  18. 【DeepLearning 文本分类实战】IMDB Data Preprocessing数据预处理
  19. 获取MAC地址的四种方法(转)
  20. 计算机视觉——SFM与三位重建

热门文章

  1. 因特网是全球范围内的什么是计算机网络,因特网
  2. jmeter beanshell脚本使用
  3. 右下角弹出广告怎么关
  4. MDK中AT45DB161驱动程序
  5. 5 打印选课学生名单
  6. HIS系统多少钱?HIS怎么卖?
  7. 几种硬盘IO性能测试工具
  8. 读书笔记-《列奥纳多·达·芬奇传》
  9. 大数据培训怎么样,怎么选择合适大数据培训机构?
  10. 游戏场景和关卡怎么设计