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. Jquerymobile随笔

    fixed <div data-role="header" data-position="fixed"> <h1>欢迎访问我的主页< ...

  2. Linux基础整理-软件的安装与卸载

    redhat/centos/fedora/suse系列: 摘自网址:http://www.runoob.com/linux/linux-yum.html yum( Yellow dog Updater ...

  3. RHEL本地yum源

    一.挂载本地镜像做yum源(环境:RHEL6.5 64位 VM11) 1.进入/etc/yum.repos.d目录, [root@localhost yum.repos.d]# ls packagek ...

  4. ASP.NET技巧:教你制做Web实时进度条

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一 ...

  5. linux下设置进程优先级方法!

    Linux系统下提升进程优先级的办法   Linux系统进程的优先级取值:-20 到 19,数越大优先级越低.  可以通过top命令来查看,NI那一列.   改变进程的优先级的方法有两种:   www ...

  6. html中 table的结构 彻底搞清 caption th thead等

    正因为有太多 随意 称呼的 教法, 所以 感到很困惑, 如, 很多人把th叫标题. 那人家 caption怎么想, th只是一个跟td一样的角色, 只是对他进行加粗 加黑了而已, 用于某些单元格的内容 ...

  7. CF461B Appleman and Tree (树DP)

    CF462D Codeforces Round #263 (Div. 2) D Codeforces Round #263 (Div. 1) B B. Appleman and Tree time l ...

  8. 安装好Android Studio(如果内存足够可以改下as的内存)

    找到studio的bin目录,找到如下文件

  9. JS keycode 事件响应

    <script language="javascript"> function keyevent(){ if(event.keyCode==13) alert(&quo ...

  10. [译]在Mac上运行ASP.NET 5

    原文:http://stephenwalther.com/archive/2015/02/03/asp-net-5-and-angularjs-part-7-running-on-a-mac 这篇文章 ...