原生php实现mvc单入口模式,[伊达原创]浅谈PHP开发中的MVC单点入口模式

[伊达原创]浅谈PHP开发中的MVC单点入口模式

何谓单点入口呢?我想PHP4时代的时候有一个很响亮的代名词“工厂模式”,因为你在开发一个大型项目的时候可能会遇到N多的类和需要你包含的类库文件,如果你把所有的类文件都写在一个程序页面里,在每一个需要使用的页面上都include包含过来,这样将会造成效率大大降低。

不过还好,php5时代多了一个相当实用的函数__autoload(),也就是说你只需要将这个函数的文件包含进来,在你声明一个对象以后,这个函数会自动加载这个类文件,下面我用实例来演示一下如何使用__autoload()来完成MVC模式下的单点入口结构。

这是我一个流量分析系统的整体结构

200708051186285930328.jpg大家可以很清晰的看到,整个系统下面只有index.php文件作为调度文件,你可以暂时把他理解成一个工厂的传达室。

cache是smarty模版的缓存文件目录.

compile是模版编译过后的暂存文件

p_w_picpaths存放图片素材和CSS样式表

lib库文件存放目录核心目录之一

smarty模版主目录

tpl存放的是HTML静态模版,当然在必要的时候也做一些简单的判断。

www整站系统的核心目录。

我们先看一下index.php里面的内容

/*

############################网站流量分析系统页面注释##########################

系统核心文件,包含实例化一个smarty对象

根据GET得到的参数来选择调用哪一个程序页面

@Email: [email]semiscon1983@hotmail.com.cn[/email]

*/

//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

function __autoload($class_name)

{

require_once $class_name . '.php';

}

?>

这时候我在一个www目录下的程序里面声明对象的时候就不需要再把这个类文件包含过来了

比如www目录下的daily.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

//-----月份查询使用的类,继承daily类部分属性和方法--------

class month extends daily {

public $i =1;

public $s = 32;

}

?>

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

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

©著作权归作者所有:来自51CTO博客作者semiscon的原创作品,如需转载,请与作者联系,否则将追究法律责任

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值