博客统计信息

51cto推荐博客
用户名:semiscon
文章数:30
评论数:47
访问量:30104
无忧币:390
博客积分:953
博客等级:4
注册日期:2007-04-30

我的技术圈(3)

更多>>
[伊达原创]浅谈PHP开发中的MVC单点入口模式
2007-08-05 12:19:36
版权声明:原创作品,如需转载,请与作者联系。否则将追究法律责任。
何谓单点入口呢?我想PHP4时代的时候有一个很响亮的代名词“工厂模式”,因为你在开发一个大型项目的时候可能会遇到N多的类和需要你包含的类库文件,如果你把所有的类文件都写在一个程序页面里,在每一个需要使用的页面上都include包含过来,这样将会造成效率大大降低。
不过还好,php5时代多了一个相当实用的函数__autoload(),也就是说你只需要将这个函数的文件包含进来,在你声明一个对象以后,这个函数会自动加载这个类文件,下面我用实例来演示一下如何使用__autoload()来完成MVC模式下的单点入口结构。

这是我一个流量分析系统的整体结构
大家可以很清晰的看到,整个系统下面只有index.php文件作为调度文件,你可以暂时把他理解成一个工厂的传达室。
cache是smarty模版的缓存文件目录.
compile是模版编译过后的暂存文件
images存放图片素材和CSS样式表
lib库文件存放目录核心目录之一
smarty模版主目录
tpl存放的是HTML静态模版,当然在必要的时候也做一些简单的判断。
www整站系统的核心目录。
我们先看一下index.php里面的内容

<?php

/*
############################网站流量分析系统页面注释##########################
系统核心文件,包含实例化一个smarty对象
根据GET得到的参数来选择调用哪一个程序页面
@Email: semiscon1983@hotmail.com.cn
*/
//include_once("./lib/class.php");
//做个对比,没有使用__autoload之前需要包含成个库函数
//页面是干净了,但效率依然低下
include_once("./lib/public_function.php");       
//使用__autoload()函数自动调用相对应的类文件
include_once('./smarty/Smarty.class.php');
$s = new Smarty;
//$s->caching = true;//开启缓存功能
$s->template_dir = './tpl';
$s->compile_dir = './compile';
$s->cache_dir = './cache';

$n = strtolower(trim($_GET['n']));
//用trim去掉前后空格 然后用strtolower进行小写转换
//如果传入参数n的值为空就调用main.php页面进行转向index.html
if (empty($n)) { $s->display("index.html"); exit(); }

switch($n) {
    case "last"                     :    include_once "./www/lastvisit.php";                break;
    case "daily"                        :    include_once "./www/daily.php";                break;
    case "month"                    :    include_once "./www/month.php";                break;
    case "year"                        :    include_once "./www/year.php";                break;
    case "area"                        :    include_once "./www/area.php";                break;
    case "ref"                        :    include_once "./www/ref.php";                    break;
    case "query"                    :    include_once "./www/query.php";                break;
    default                            :    $s->display("index.html");
}
?>
一个核心调度文件就是这么简单,根据GET过来的值来引入相对应的程序页面。我们再看看包含文件之一的./lib/public_function.php
<?php
function __autoload($class_name)
{
    require_once $class_name . '.php';
}
?>
这时候我在一个www目录下的程序里面声明对象的时候就不需要再把这个类文件包含过来了
比如www目录下的daily.php
<?php
include("conn.php");
//##############获得今天日期######################
$date1 = date("Y-m-d");
//如果用户GET过来一个值是act的一个函数
if(isset($_GET["act"])) { //判断这个变量是否被设置了
    $yyy = sprintf("%04s",$_GET["y"]); //年数据
    $mmm = sprintf("%02s",$_GET["m"]); //月数据
    $ddd = sprintf("%02s",$_GET["d"]); //日数据
    $date1 = $yyy."-".$mmm."-".$ddd;   //根据用户输入的参数,得到日期字符串
}
/*
以上这些代码是为了历史查询页面搜索数据时使用的
*/
$date2 = date("Y年m月d日");
$s->assign("today",$date2); //将本月的日期传入模版
//------------- 创建daily对象实例-----------------
$daily = new daily();//只需要去声明这个对象就可以了,系统自动包含类文件
//-------------导入当前时间的函数------------------
$daily->__getSql("select name,value from counter_daily where date='$date1' ;");
$daily->__setDate($date1);
//--------将相对应的属性和函数返回值赋值给变量--------
$h = $daily->__getHour();
$sum = $daily->sum;
$hper = $daily->__getPercent();
//-------------将获得变量传入模版------------------
$s->assign("h",$h);
$s->assign("sum1",$sum);
$s->assign("hper",$hper);
$s->display("daily.html");
?>
而且__autoload()函数还可以自动把继承的父类也一起调用,比如这个每月流量分析表的类文件就很简单
./lib/month.php
<?php
//-----月份查询使用的类,继承daily类部分属性和方法--------
class month extends daily {
         public $i =1;
         public $s = 32;
}
?>

其实我并没有完全按照MVC的架构去写这个系统,只是实现了视图view和控制器controller,那么逻辑层的模型Model被一个执行层代替了,也就是说用index.php进行控制和调用,tpl下的编辑模版去面向客户,然后由mod和lib进行执行和运算。

以上只是我这段时间在家学习PHP的一点心得,希望能对和我一样喜欢PHP的朋友有一些帮助。

本文出自 “浇花匠” 博客,转载请与作者联系!

分享至
更多
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别:PHP技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 
2007-08-05 21:20:54
不错。
php5时代多了一个相当实用的函数__autoload(),也就是说你只需要将这个函数的文件包含进来,在你声明一个对象以后,这个函数会自动加载这个类文件
PHP5里加啦?方便很多哪

2007-08-07 09:51:05
index.php进行控制和调用,tpl下的编辑模版去面向客户,然后由mod和lib进行执行和运算。
你好,博主,你的BLOG人气很旺哦,我是中国福网,广告 有事与你相宜,祥谈加我QQ:900676

 

发表评论            

【技术门诊】专家解析:软考重点难点及应试技巧
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: