【smarty项目源码】模拟smarty模版文件的解析过程

news/2023/6/10 21:32:17

 

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


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

 

案例:

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[下标]}

转载于:https://www.cnblogs.com/wangluochong/p/4941504.html


https://dhexx.cn/news/show-16679.html

相关文章

win32获取当前运行程序的内存地址_运行于微软Windows 10X上的Win32应用将受到诸多限制...

IT之家2月18日消息 IT之家先前曾报道微软Windows 10X将支持大部分Win32应用&#xff0c;但最新消息显示&#xff0c;运行于新系统的Win32应用将受到诸多限制。据报道Windows 10X系统将使用容器来运行应用程序&#xff0c;包括Win32、UWP和PWA&#xff0c;以此降低系统受到恶意软…

mac共享文件android,Mac如何访问安卓系统共享文件夹的方法

Mac系统与安卓系统的差异导致了很多网友都无法完成两个系统间互相访问共享文件夹的操作&#xff0c;对办公等造成了很多的困扰&#xff0c;那么到底Mac系统如何访问WIN系统的共享文件夹呢?今天学习啦小编就为大家带来了Mac如何访问安卓系统共享文件夹的解决方法&#xff0c;希…

Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation

Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation 通过上一小节的操作&#xff0c;我们新建了2个动画&#xff1a;PlayerIdleAnimation和PlayerWalkingAnimation。而且在单击Animation视图里的播放按钮时&#xff0c;也看到了动画的效果。但是现在还需…

qt执行linux命令_这条Linux命令执行完女朋友都跟人跑了

作为程序员&#xff0c;时间是金钱&#xff0c;效率是绳命。可万一遇到产品经理临时又加需求&#xff0c;我们常常是这个状态&#xff1a;如果是这个状态&#xff0c;那已经是很好的状况了。万一如果因为工作忙碌没时间陪女朋友&#xff0c;那么就很可能免费获赠一顶精致的绿帽…

linux mysql安装_Linux下mysql的安装

1.查看Linux版本。cat /etc/redhat-release2.卸载系统原有的mariadb和MySQL。yum检查否安装了mariadb和mysqlyum repolist enabled | grep “mysql.-community.“yum repolist all | grep mysqlyum list installed | grep mariadb删除yum remove mysql mysql-server mysql-libs…

焓湿图软件 android,焓湿图查询计算软件

焓湿图计算软件是一款查询、计算焓湿图的电脑软件&#xff0c;用户可以自己设定当地的大气压值以及绘图精度&#xff0c;能选择绘制一次回风还是二次回风。而且用户也可以对绘制好的图像进行数据的重新输入&#xff0c;绘图更加精准。焓湿图计算软件主要特性1、焓湿图是将湿空气…

你不知道的JavaScript--Item29 DOM基础详解

看完JavaScript高级程序设计&#xff0c;整理了一下里面的DOM这一块的知识点&#xff0c;比较多&#xff0c;比较碎&#xff01;DOM在整个页面的地位如图&#xff1a; DOM&#xff08;文档对象模型&#xff09;是针对HTML 和XML 文档的一个API&#xff08;应用程序编程接口&…

import pandas as pd什么意思_Tips:python 用 pandas 实现数据透视表

透视表是一种可以对数据动态排布并且分类汇总的表格格式。对于熟练使用 excel 的伙伴来说&#xff0c;一定很是亲切&#xff01;实际上,Python使用pandas同样可以快速实现数据透视表的功能&#xff0c;不同方法反应不同的编程思维&#xff0c;以下是几种实现数据透视表的简单方…

HTML画笔移出画布停止,Html5 Canvas 使用

你的浏览器不支持 canvas&#xff0c;请升级你的浏览器。var c document.getElementById("myCanvas");var ctx c.getContext("2d");/*beginPath(): 新建一条路径&#xff0c;路径一旦创建成功&#xff0c;图形绘制命令被指向到路径上生成路径moveTo(x, y…

骆昊python100天百度云_学习骆昊的python100天——Day04,循环

# for-in循环 # 1~100 求和 sum 0 for i in range(101): sum i print("从1加到100的和是&#xff1a;{}".format(sum)) # range(101)可以产生一个0到100的整数序列。 # range(1, 100)可以产生一个1到99的整数序列。 # range(1, 100, 2)可以产生一个1到99的奇数序列…