lmx22

PHP的MVC框架开发简单示例

  MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码将业务逻辑和数据显示分离。

  这里用一个简单的例子来演示MVC开发原理。

1.首先分别建立 模板目录(template)、动态页面目录(compile)、静态页面目录(cache),在template目录里建立模板文件 template.php

代码如下:

<html>
 <head>
  <title>{$title}</title>
 </head>
 <body>{$content}</body>
</html>

这里分别预制{$title} 和 {$content}2个变量。本次演示案例的功能,就是将模板变量替换成赋值后,生成最终页面。

2.在根目录分别建立 控制器文件 index.php 和 模型类文件 smarty.class.php

其中 控制器的功能是:接受用户的输入并调用模型和视图去完成用户的需求。

模型模型表示企业数据和业务规则,这里的功能是接受数据后,读取模板文件,将模板变量替换成用户数据,并生成最终页面文件。

index.php 代码如下:

<?php
//应用根目录
define(\'ROOT_PATH\', realpath(\'./\'));

define(\'DEBUG_MODE\', False);

//模板缓存时间
define(\'CACHE_TIME\', 3600);

if(DEBUG_MODE)
{
 $gAppStartTime = microtime(true);
}

//引入模型类
require_once(ROOT_PATH . \'/smarty.class.php\');

//模板目录
$gTpl = new template(\'./template\');

//调用模型类的匹配函数,存入模板变量和值
$gTpl->assign(\'title\', \'Welcome to My World\');
$gTpl->assign(\'content\', \'This is a demo too too\');
$gTpl->display(\'index.php\');

if(DEBUG_MODE)
{
 $gAppEndTime = microtime(true);
 $runtime = $gAppEndTime - $gAppStartTime;
 echo "This Application is running over[".strval($runtime)."s]";
}
?>

3.smarty.class.php代码如下:

<?php

if(!defined(\'ROOT_PATH\')) exit(\'Access Denied\');

class template
{

 protected $tpl_dir = \'./tpl\'; 
 //动态页面目录
 protected $com_dir = \'./compile\';
 //静态页面目录
 protected $cache_dir = \'./cache\';
 //模板变量和赋值 数组
 protected $vars = array(); 
 
 //类构造函数
 function __construct($tpl = \'\', $com = \'\')
 {
  if($tpl)
  {
   $this->tpl_dir = $tpl;
  }
  if($com)
  {
   $this->com_dir = $com;
  }
  //判断文件是否具有读取和修改权限
  if(!is_writable($this->com_dir) || !is_readable($this->tpl_dir))
  {
   exit(\'Permission Denied!\');
  }
 }
 function __destruct()
 {  
 }
 
 //将匹配的模板变量名 和 值存入数组
 public function assign($varname = \'\', $varvalue = \'\')
 {
  $this->vars[$varname] = $varvalue;
 } 
 //获取模板源码
 protected function fetch_template($tplname = \'\')
 {
  $tplname = $this->tpl_dir . \'/\' . $tplname;
  if(!file_exists($tplname))
  {
   return \'Template is not Exists!\';
  }
  if(!is_readable($tplname))
  {
   return \'File can not read\';
  }
  $html = file_get_contents($tplname);  
  return $html;
 }
 
 //正则表达式匹配替换模板定义变量
 protected function compile_tpl($html = \'\')
 {
  if(!$html)
  {
   return;
  }
  $pattern = \'/(.*?){\$([a-zA-Z_]{1,}\w*)(.*?)}/s\';

  return $html = preg_replace($pattern, "\\1<?php echo \$this->vars[\'\\2\']; ?>\\3", $html);
  //echo htmlentities($html);
 }
 
 //生成结果页面
 public function display($tplname)
 {
  $html = $this->fetch_template($tplname);
  $html = $this->compile_tpl($html);
  //关闭关闭输出缓冲区
  ob_end_flush();
  //打开缓冲区
  ob_start();
  $filename = $this->com_dir . \'/\' . md5($tplname).\'.php\';
  //include $filename;
  if(!file_exists($filename) || (time() - filectime($filename) > CACHE_TIME) || DEBUG_MODE)
  {
   file_put_contents($filename, $html);
  }
  
  include $filename;
  
  //输出缓冲区内容
  $result = ob_get_contents();
  //清空缓冲区
  ob_end_clean();
  
  $cache_file = $this->cache_dir .\'/\'. md5($tplname) . \'.html\';
  
  if(!file_exists($cache_file) || (time() - filectime($cache_file) > CACHE_TIME) || DEBUG_MODE)
  {
   file_put_contents($cache_file, $result);
  }  
  include $cache_file;  
 }
 
}

 

分类:

技术点:

相关文章: