mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职、无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利。

  我们在php开发中,视图层view是不允许有php代码来操作数据库之类的来获取数据的,我们一般都会在控制器层controller,就已经把视图层要展示的数据准备好,方便视图层直接用来展示。

  smarty模板技术,可以让数据和视图进行分离,让视图中不能直接出现php代码。这样的话,让前段页面的开发和后台数据的开发,可以双管齐下,同时进行了。

  

  smarty模板的使用比较简单,主要有两个非常核心的函数。一个是assig(),把模板中要使用的数据进行欲赋值,一个是display(),用来解析和展示最后的视图模板。

  使用的简单代码如下:

include_once "Smarty.class.php";//引入smarty类

$smarty = new Smarty;//创建smarty对象

$smarty->assign("name","zhangmiao");//赋值,以备模板中使用
$smarty->assign("age","18"); $smarty->display('index.tpl');//引入模板,展示视图页面

我们看下模板源代码是这样的:

<h1>测试模板1</h1>
我的名字是:{$name}<br/>
我的年纪是:{$age}<br/>

浏览器页面是这样的:

疑问:我们模板中没有php代码,我们只用了{$name}和{$age}就能把对应的变量给展示了出来,是什么鬼呢?

然后,我们一看smarty编译后的文件是这样的:

<h1>测试模板1</h1>
我的名字是:<?php echo $this->var["name"]; ?><br/>
我的年纪是:<?php echo $this->var["age"]; ?><br/>

原来如此,最终还是变成了含有php代码的模板,但是这个模板中把标签转成php代码的工作,我们交给了smarty模板引擎来完成的。

那到底smarty模板引擎是怎么把模板里面的非php代码的标签,转变成被最终可以解析执行的php代码的呢?

主要思路是:替换。

分成了两步:

  1、用过assign函数把要解析的标签变量赋值

  2、通过display函数把标签替换成对象的php变量

我们根据这个思路,自己也写了个简易版的smarty模板引擎,算是多smarty模板引擎设计原理的一种理解。但是只能解析单个变量的标签,其他标签均没有处理。代码如下:

class MySmarty{

    //模板存放路径
public $template = './template/';
//编译后模板路径
public $template_c = './template_c/'; //存放变量的数组,通过assign函数赋值
public $var = array(); //变量赋值
public function assign($vkey,$value){
if($vkey != ""){
$this->var[$vkey] = $value;//把要模板中解析的数据压入数组
}
} //模板中变量替换
public function display($path){
$template_path = $this->template.$path;
$template_c_path = $this->template_c.$path.".php";
if(!file_exists($template_path)){
return false;
} //只有解析后的模板文件不存在或者模板源文件有新的改动的情况下 重新解析模板
if(!file_exists($template_c_path) || filemtime($template_path)>filemtime($template_c_path)){
//获取模板源文件,用来替换
$template_content = file_get_contents($template_path); $pattern = array(
'/\{\s*\$([a-zA-Z][a-zA-Z0-9_]*)\s*\}/i'
);
$replace = array(
'<?php echo $this->var["${1}"]; ?>'
);
//用正则去替换模板源文件中的变量符号{$varname}
$res = preg_replace($pattern,$replace,$template_content);
//编译后文件写入某个目录
file_put_contents($template_c_path,$res);
}
//引入编译后文件,其实就是执行了那个php文件的代码
include_once $template_c_path; }
}

我们调用自己的assign和display放入引入,也能正常解析使用啦

转:https://www.cnblogs.com/zmfly/p/6548761.html

最新文章

  1. NodeJS、NPM安装配置步骤(windows版本)
  2. 通过jconsole监控tomcat JVM 内存、线程、CPU
  3. Python爬虫库Scrapy入门1--爬取当当网商品数据
  4. 综合使用union和limit区分结果并限制返回结果集的条数
  5. oracle client与ODAC的字符集
  6. servlet请求转发、包含以及重定向
  7. c# 工具
  8. Java笔记(六)&hellip;&hellip;程序流程控制
  9. 在web项目启动时,使用监听器来执行某个方法
  10. python selenium-webdriver 通过cookie登陆(十一)
  11. calling c++ from golang with swig--windows dll (四)
  12. .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)
  13. python functools.wraps functools.partial实例解析
  14. 高效获得Linux函数调用栈/backtrace的方法【转】
  15. 手机连接wamp网页
  16. Python 使用sys.exc_info自己捕获异常详细信息
  17. python之块包导入
  18. python线程池
  19. VC中添加头文件以及库
  20. C++_友元函数总结(转)

热门文章

  1. 【置换群】CH Round #63 - OrzCC杯#2省选热身赛 exchange
  2. 【费用流】【Next Array】费用流模板(spfa版)
  3. scrapy初探
  4. HTML5本地缓存localStorage和sessionStorage的操作方法收集
  5. android_我的第一个Android程序
  6. asp.net HttpModule和HttpHandler
  7. 一个简单的假vue全家桶(vue+vue-router+require)
  8. 用友u8数据库表结构
  9. C++中的模板学习
  10. Linux 动态库 静态库