PhpView:一个以PHP语言为模板语言的模板类
2008-07-13 12:43
375 查看
PhpView:一个以PHP语言为模板语言的模板类 作者:谢声涛 shishengsoft@gmail.com Smarty用来实现代码与界面的分离,确实是一种不错的选择。但是Smarty有自创的一套语法, 使用起来感觉很麻烦,于是想到用PHP语言实现一个精简的模板类,名字就叫PhpView。 其实,最简单的模板机制就是在PHP脚本文件中include一个模板文件。但是这样缺点比较多。 一、使用示例 <?php $t = new PhpView(); $t->templateDir = './template'; $t->cacheDir = './cache'; $t->serializeDir = './serialize'; $t->assign('title', $title); $t->assign('hello', $hello); $t->display("example.html"); ?> 如上所示,和Smarty的接口很相似,好像现在一些PHP模板类都是大同小异的。 二、实现代码 文件名:PhpView.class.php <?php /******************************************************************************* * 简介: * 1、模板语言使用PHP语言,而其它模板类使用自定义的专用语言,需要进行正则替换。 * 2、支持缓存机制,模板数据变化,就刷新缓存文件。 * 3、可以设定缓存时间,缓存过期,就刷新缓存文件。 * 4、支持配置文件方式初始化设定目录,也可以后期更改目录,更加灵活(也许是多余)。 ********************************************************************************/ /** * PHP视图模板类 * @class PhpView * @author xie sheng tao <xie.s.t@163.com> */ class PhpView { /** * 是否使用缓存机制进行工作 * @var boolean $cacheEnable true-启用缓存机制;false-关闭缓存机制 */ public $cacheEnable = true; /** * 缓存时间 * 超过缓存时间则自动更新缓存。 * @var integer $cacheExpire 0-永远不过期;> 0 判断。< 0 ?? 或者 = 0 始终过期;> 0 判断;< 0 永远不过期 */ public $cacheExpire = 0; /** * 模板文件的存贮目录 * @var string $templateDir */ public $templateDir = ''; /** * 缓存文件的存贮目录 * @var string $cacheDir */ public $cacheDir = ''; /** * 序列化文件的存贮目录 * @var string $serializeDir */ public $serializeDir = ''; /** * 保存模板文件中使用的变量的名、值列表 * @var array $m_templateVarList */ private $m_templateVarList = array(); /** * 记住系统目录是否已经检查过并且符合要求。避免以全局方式使用时重复检查。 * @var boolean $m_sysDirReady */ private $m_sysDirReady = false; /** * 当前操作使用的模板文件 * @var string $m_templateFile */ private $m_templateFile = ''; /** * 类的构造函数 */ public function __construct() { $this->readConfig(); } /** * 读取PhpView类的配置信息 */ public function readConfig() { if(file_exists("config.php")) { include_once("config.php"); } if(isset($g_cacheEnable)) { $this->cacheEnable = $g_cacheEnable; } if(isset($g_templateDir)) { $this->templateDir =$g_templateDir; } if(isset($g_cacheDir)) { $this->cacheDir = $g_cacheDir; } if(isset($g_serializeDir)) { $this->serializeDir = $g_serializeDir; } if(isset($g_sysDirReady)) { $this->m_sysDirReady = $g_sysDirReady; } } /** * 检测所需目录是否存在。如果不存在,则报错并退出。 * 所需目录为:模板文件目录、缓存文件目录、序列化文件目录 */ public function checkSysDir() { if($this->templateDir == '') { die("模板文件目录未设置。"); } if(!is_readable($this->templateDir)) { die("模板文件目录不可读。"); } if($this->cacheDir == '') { die("缓存文件目录未设置。"); } if(!(is_readable($this->cacheDir) && is_writable($this->cacheDir))) { die("缓存文件目录不可读写。"); } if($this->serializeDir == '') { die("序列化文件目录未设置。"); } if(!(is_readable($this->serializeDir) && is_writable($this->serializeDir))) { die("序列化文件目录不可读写。"); } $this->m_sysDirReady = true; return; } /** * 指派模板文件中使用的变量 * @param string $varName 在模板中使用的变量名 * @param any &$varValue PHP中支持的数据类型 * or * @param array $varName 使用数组来传递名值列表,即变量名作为关联索引,变量值为元素值。 */ public function assign($varName, $varValue = null) { if(func_num_args() == 1) { $varList = func_get_arg(0); if(gettype($varList) == 'array') { foreach($varList as $name=>$value) { $this->m_templateVarList[$name] = $value; } } } else if(gettype($varName) == 'string') { $this->m_templateVarList[$varName] = $varValue; } return; } /** * 调用模板文件,生成模板中的变量,输出到浏览器 * @param string $file 模板文件名 */ public function display($file) { if(!$this->m_sysDirReady) { $this->checkSysDir(); } $this->m_templateFile = $file; if($this->cacheEnable) { $this->cacheOutput(); } else { $this->directOutput(); } return; } /** * 使用缓存机制处理模板 * 实现原理: * 1、取得客户端请求的链接url。缓存文件和序列化文件的文件名使用此url命名。 * 2、将存贮当前模板变量的数组序列化为一个字符串。 * 3、读取模板文件对应的序列化文件,得到前一个模板变量数组的序列化字符串。 * 4、判断前后两次序列化字符串是否相等。如果相等,则直接把缓存文件的内容输出到浏览器。 * 否则,重新生成序列化文件和缓存文件,然后把模板处理结果输出到浏览器。 */ private function cacheOutput() { $html = ''; $cache_filename = @urlencode(basename(SERVER['REQUEST_URI'])); $cur_serialize = @serialize($this->m_templateVarList); $pre_serialize = $this->readSerialize($cache_filename); if($cur_serialize === $pre_serialize) { if(!$this->isCacheFileTimeout($cache_filename)){ if($html = $this->readCacheFile($cache_filename)) { echo '使用缓存文件.'; echo $html; return; } } echo '缓存文件过期.'; } echo '刷新缓存文件.'; $this->saveSerialize($cache_filename, $cur_serialize); /*foreach($this->m_templateVarList as $name => $value) { eval("/$name = /$value;"); // 通过 eval 函数生成模板文件中使用的变量 }*/ extract($this->m_templateVarList); ob_start(); @include($this->templateDir . '/' . $this->m_templateFile); //sleep(5); $html = ob_get_contents(); ob_clean(); $this->writeCacheFile($cache_filename, $html); echo $html; return; } /** * 直接将模板处理结果输出到浏览器,不使用缓存机制 */ private function directOutput() { foreach($this->m_templateVarList as $name => $value) { eval("/$name = /$value;"); // 通过 eval 函数生成模板文件中使用的变量 } ob_start(); @include($this->templateDir . '/' . $this->m_templateFile); ob_flush(); return; } /** * 将模板处理结果写入缓存文件 * @param string $file 缓存文件路径 * @param string $content 缓存内容 * @return null */ private function writeCacheFile($file, $content) { $filename = $this->cacheDir . '/' . $file; @file_put_contents($filename, $content); return; } /** * 读取缓存文件 * @param string $file 缓存文件路径 * @return string 缓存文件的内容 */ private function readCacheFile($file) { $filename = $this->cacheDir . '/' . $file; $html = @file_get_contents($filename); return $html; } /** * 保存序列化字符串到文本文件中 * @param string $file 序列化文件路径 * @param string $content 序列化数据的字符串 * @return null */ private function saveSerialize($file, $content) { $filename = $this->serializeDir . '/' . $file; @file_put_contents($filename, $content); return; } /** * 读取文本文件中存贮的序列化字符串 * @param string $file 序列化文件路径 * @return string 序列化数据的字符串 */ private function readSerialize($file) { $filename = $this->serializeDir . '/' . $file; $content = @file_get_contents($filename); return $content; } /** * 判断缓存文件是否过期 * @param string $file 缓存文件 * @return boolean */ private function isCacheFileTimeout($file) { if($this->cacheExpire == 0)//缓存时间为0,表示永远不过期 { return false; } $cacheFile = $this->cacheDir . '/' . $file; if(file_exists($cacheFile)) { $modifyTime = filemtime($cacheFile); $currentTime = time(); if(($currentTime - $modifyTime) > $this->cacheExpire){ return true; } return false; } return true; } } // end class ?>
相关文章推荐
- PhpView:一个以PHP语言为模板语言的模板类
- 一个新手程序员,是应该只钻研一门语言,还是同时钻研几门,比如PHP和JAVA?
- dede模板标签以及dedetag.class.php模板类
- php 编写一个简单的模板引擎
- 使用window-based模板创建一个单view程序
- php初探: 一个简单的mysql数据库分页的程序模板
- PHP技术-实现一个最简单的模板分离
- 一个强大的在线编译运行网站,JAVA/C#/PHP绝大部分语言都有
- SugarCRM 一个页面控制两个模块(editview.php)
- 我对View层的视图模板解析引擎的认识(Java&PHP)
- Xamarin XAML语言教程模板视图TemplatedView(二)
- Xamarin XAML语言教程模板视图TemplatedView(二)
- PHPCMS V9.3.2用户注册模板中的一个低级Bug
- PHP语言MVC思想深入剖析(亲自写一个MVC框架)
- 如何两个模板类会相互包含,那么需要在类定义之前声明其中一个类,并且声明时要用模板。
- php zend Framework 模板显示图片 显示不失败,就一个红叉叉
- 如何将一个模板类A作为模板类B的模板参数
- 一个PHP语言的小陷阱
- PHPCMS V9.3.2用户注册模板中的一个低级Bug
- Xamarin XAML语言教程模板视图TemplatedView(二)