1. <?php
  2. class MyMiniSmarty{
  3. //模版文件的存放路径
  4. var $template_dir="./templates/";
  5. //编译文件的存放路径 ,编译文件的名称格式暂定为:com_对应的tpl.php
  6. var $complie_dir="./templates_c";
  7. //模版变量数组:存放所有模版变量的值
  8. var $tpl_vars=array();
  9. //这里我们主要模拟两个方法
  10. //参数1-模版变量     参数2:模版变量的值
  11. function assign($tpl_var,$val=null){
  12. if($tpl_var!=''){
  13. $this->tpl_vars[$tpl_var]=$var;
  14. }
  15. }
  16. //这里编写display
  17. //参数1-要显示的模版文件名
  18. function display($tpl_file){
  19. //模版文件的路径
  20. $tpl_file_path=$this->template_dir.$tpl_file;
  21. //编译文件的命名及路径
  22. $complie_file_path=$this->complie_dir."com_".$tpl_file.".php";
  23. //判断当前模版文件是否存在
  24. if(!file_exists($tpl_file_path)){
  25. //如果当前模版文件不存在,则返回false
  26. return false;
  27. }
  28. //查看是否有编译文件,如果没有编译文件,或者说模版文件的修改时间大于编译文件的生成时间,则需要重新编译
  29. if(!file_exists($comlie_file_path) ||filemtime($tpl_file_path)>filemtime($complie_file_path)){
  30. //获取模版文件的内容
  31. $tpl_file_content=file_get_contents($tpl_file_path);
  32. //这里我们的核心是怎样把tpl转化为php文件
  33. $pattern=array(
  34. //1.\{ - 转义{ 左括号 2.\s* - 代表一个或多个空格 3.\$ - 转义$符号  4.\} - 转义 } 右括号
  35. '/\{\s*\$([a-zA-Z][a-zA-Z0-9]*)\s*\}/i'
  36. );
  37. $replace=array(
  38. '<?php echo $this->tpl_vars["${1}"] ?>'
  39. );
  40. //将类似 {$title}替换为<?php echo $this->tpl_vars["title"] ? >,返回替换后的字符串
  41. $new_str=preg_replace($pattern,$replace,$tpl_file_content);
  42. //编译文件的生成:将正则替换后的模版文件中的内容写入到编译文件
  43. file_put_contents($complie_file_path,$new_str);
  44. }
  45. //如果存在编译文件并且模版文件没有改动,则直接引入编译文件
  46. include $complie_file_path;
  47. }
  48. }
  49. ?>

注意:对象也可以作为模版变量

案例:

php文件:

$smarty=new Smarty();
$var1=“简单字符串”;
$var2=new 对象名();
$var3=array(内容列表..);
$smarty->assign(“var1”,$var1);
$smarty->assign(“var2”,$var2);
$smarty->assign(“var3”,$var3);

模版文件:

取出 var1 对应的值:  {$var1}<br/>
取出 var2 对应的值:  {$var2->属性或者方法}
取出 var3 对应的值: {$var3[下标]}

【smarty项目源码】模拟smarty模版文件的解析过程的更多相关文章

  1. Spring源码情操陶冶-ComponentScanBeanDefinitionParser文件扫描解析器

    承接前文Spring源码情操陶冶-自定义节点的解析,本文讲述spring通过context:component-scan节点干了什么事 ComponentScanBeanDefinitionParse ...

  2. Spring源码情操陶冶-自定义节点的解析

    本文承接前文Spring源码情操陶冶-DefaultBeanDefinitionDocumentReader#parseBeanDefinitions,特开辟出一块新地来啃啃这块有意思的骨头 自定义节 ...

  3. Spring源码情操陶冶-AnnotationConfigBeanDefinitionParser注解配置解析器

    本文承接前文Spring源码情操陶冶-自定义节点的解析,分析spring中的context:annotation-config节点如何被解析 源码概览 对BeanDefinitionParser接口的 ...

  4. Android 开源项目源码解析(第二期)

    Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...

  5. EDKII Build Process:EDKII项目源码的配置、编译流程[三]

    <EDKII Build Process:EDKII项目源码的配置.编译流程[3]>博文目录: 3. EDKII Build Process(EDKII项目源码的配置.编译流程) -> ...

  6. Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/15/springboot2_code/ 项目结构 结构分析: Spring-boot-pr ...

  7. C#项目 学生选课系统 C#窗口 Winform项目 项目源码及使用说明

    这是一个学生选课信息管理系统,使用VS2010+SQL2008编写,VS2017正常使用. 项目源码下载地址 https://gitee.com/whuanle/xkgl 笔者录了两个视频,打开项目源 ...

  8. java crm 进销存 springmvc SSM 项目 源码 系统

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

  9. Java SSM 客户管理 商户 管理系统 库存管理 销售报表 项目源码

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

随机推荐

  1. HTML5播放器实例

    鉴于html5Audio and video的使用,设计了一个自定义风格的播放器,除实现一些基本的默认功能之外,还实现了一些高级功能. 具体功能如下: 实现播放暂停按钮 实现静音按钮 实现音量调节滑动 ...

  2. Ubuntu terminal 不见了

    Python出问题了,卸载Python后,terminal竟然消失了.. Ctrl + Alt + T出现的是XTerm 解决办法: 在XTerm中输入命令: # sudo apt-get insta ...

  3. 使用session防止重复提交

    一.表单重复提交的常见应用场景 <%@ page language="java" import="java.util.*" pageEncoding=&q ...

  4. oracle中的sql%rowcount,sql%found、sql%notfound、sql%rowcount和sql%isopen

     Oracle 存储过程 删除表记录时删除不存在的记录也是显示删除成功 create or replace procedure delDept(p_deptno in dept.deptno%type ...

  5. swift错误和异常处理

    异常 (exception) 和错误 (error). 在 Objective-C 开发中,异常往往是由程序员的错误导致的 app 无法继续运行,比如我们向一个无法响应某个消息的NSObject 对象 ...

  6. PPTP(Point to Point Tunneling Protocol),即点对点隧道协议。

    PPTP PPTP(Point to Point Tunneling Protocol),即点对点隧道协议.该协议是在PPP协议的基础上开发的一种新的增强型安全协议,支持多协议虚拟专用网(VPN),可 ...

  7. 大熊君大话NodeJS之开篇------Why NodeJS(将Javascript进行到底)

    一,开篇分析 大家好啊,大熊君又来啦(*^__^*) 嘻嘻……,之前我写过一系列关于JS(OOP与设计模式)方面的文章,反响还好,其实这也是对我本人最大的鼓励,于是我决定我要将JavaScript进行 ...

  8. springMVC 缓存(入门 spring+mybaties+redis一)

    使用redis之前需要咋电脑上安装redis: 使用spring+mybaties+redis的本质是扩展类   org.apache.ibatis.cache.Cache:在我们自己扩展的Cache ...

  9. jquery 使用textarea

    问题: 若在textarea标签中键入一个回车时,将插入2个字符\n\r ,将在datagrid不能正确显示. \n: 回车符 \r: 换行符  解决方案: txt = txt.Replace(&qu ...

  10. ggplo2学习笔记——基本图形类型

    1.散点图:又称散点分布图,是以一个变量为恨坐标,另一个变量为纵坐标,利用散点(坐标点)的分布形态反映变量统计关系的一种图形.可以用来确认两个变量之间的关系.绘制自由曲线.矩阵关联分析等. 2.条形图 ...