smarty模板引擎原理解析

//php 控制器文件
<?php
//引入模板引擎文件
include("20130304.php");
$smarty = new TinySmarty();
$qq_numbers=array('a1'=>'12333','a2'=>'2222222','a3'=>'333333','a4'=>'3333333');
$smarty->assign($qq_numbers);
$smarty->assign('title','这是我的QQ号码');
$smarty->assign('contents','这是我的QQ:1211884772');
$smarty->display('20120305_01.html');

?>
模板引擎类20130304.php
<?php
/***
smarty模板引擎原理
1:读取模板文件
2:替换模板标签为php可执行代码
3:保存替换成功的php文件
***/
/*
问题?
1:每次访问都编译浪费cpu?
编译文件存在,不用在编译直接引入
2:模板文件修改后,必须重新编译该文件
当模板文件修改时间大于编译文件修改时间,说明模板文件被修改了,
因此要重新编译模板文件
*/
class TinySmarty{
 //模板文件存放目录
 public $template_dir="./templates/";
 //编译后文件存放目录
 public $compile_dir="./c_templates/";

 //存放变量值
 public $tpl_vars=array();

 //assign
 //将变量以数组形式存放到该$tpl_var属性
 public function assign($tpl_var,$var=null){
  //传入数组形式,为批量赋值
  if(is_array($tpl_var)){
   foreach($tpl_var as $_key=>$_val){
    if($_key!=''){
     $this->tpl_vars[$_key] = $_val;
    }
   }
  }else{
   //传入非空字符
   if($tpl_var!=''){
    $this->tpl_vars[$tpl_var] = $var;
   }
  }
 }

 /*
 name display
 param string $tpl_file 文件名

 */
 public function display($tpl_file){
  //模板文件路径
  $template_file_path = $this->template_dir.$tpl_file;
  //编译文件路径
  $compile_file_path = $this->compile_dir.$tpl_file;
  //判断编译文件是否存在
  if(!file_exists($compile_file_path)||filemtime($template_file_path)>filemtime($compile_file_path)){
   //判断文件是否存在
   if(!file_exists($template_file_path)){
   return false;
   }
   //读取文件内容
   $fpl_file_con = file_get_contents($template_file_path);

   //替换模板标签
   //如:{$title} 替换为<?php echo $title; ? >
   //正则表达式//此处正则涉及到正则的反响引用
   $pattern = '/{\s*\$([_a-zA-Z][_0-9a-zA-Z]*)\s*\}/i';
   $replace = '<?php echo $this->tpl_vars["${1}"];?>';
   $new_file_con= preg_replace($pattern,$replace,$fpl_file_con);
   //写入文件内容
   file_put_contents($compile_file_path,$new_file_con);
  }

  //引入编译后的文件
  include ($compile_file_path);
 }
}

?>
模板文件20120305_01.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{$title}</title>
</head>
<body>
<h1>hello-</h1>
{$contents}
</body>
</html> 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

在idea中maven项目jdk编译version总是跳到1.5

bug描述 项目ide: idea 项目构建工具:maven bug现象:每次修改pom之后,idea自动扫描一遍,然后发现默认的compile级别跳到5....

35710
来自专栏hotqin888的专栏

EngineerCMS增加项目日志、大事记的时间轴

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1292
来自专栏C/C++基础

Linux下Socket网络编程send和recv使用注意事项

ssize_t send( SOCKET s, const char *buf, size_t len, int flags );

1533
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版第四章函数的逆向

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

941
来自专栏电光石火

maven-source-plugin 自动将源码打包并发布

1853
来自专栏木子昭的博客

简要说明__python3中的进程/线程/协程

多任务可以充分利用系统资源,极大提升程序运行效率,多任务的实现往往与 多线程,多进程,多协程有关 稳定性: 进程 > 线程 > 协程 系统资源占用量:进程...

3488
来自专栏运维小白

19.11 自动发现

自动发现 修改自动发现规则的相关数据获取间隔 ? 然后修改数据更新间隔(秒),改成以秒计算 60秒 ? 配置好以后到监控中心,查看图形相关,可以选择查看某一块网...

20911
来自专栏互联网杂技

利用机器学习把草图自动生成HTML

项目地址 https://github.com/ashnkumar/sketch-code 可以先clone到本地

1582
来自专栏奇点大数据

提高hadoop的可靠性(上)

提高hadoop可靠性已经有很多方法了,我尝试着收集整理了5种,通过修改Hadoop默认配置就可以极大的提升Hadoop的可靠性,本文先列举了前3种: (1)文...

3167
来自专栏Albert陈凯

Hadoop离线数据分析平台实战——390DimensionConverter相关服务设计Hadoop离线数据分析平台实战——390DimensionConverter相关服务设计

Hadoop离线数据分析平台实战——390DimensionConverter相关服务设计 DimensionConverter类作用&问题 Dimension...

35310

扫码关注云+社区

领取腾讯云代金券