设为首页 收藏本站
查看: 738|回复: 0

[经验分享] 浅谈PHP开发中的MVC单点入口模式

[复制链接]

尚未签到

发表于 2015-8-27 10:12:55 | 显示全部楼层 |阅读模式
  何谓单点入口呢?我想PHP4时代的时候有一个很响亮的代名词“工厂模式”,因为你在开发一个大型项目的时候可能会遇到N多的类和需要你包含的类库文件,如果你把所有的类文件都写在一个程序页面里,在每一个需要使用的页面上都include包含过来,这样将会造成效率大大降低。
不过还好,php5时代多了一个相当实用的函数__autoload(),也就是说你只需要将这个函数的文件包含进来,在你声明一个对象以后,这个函数会自动加载这个类文件,下面我用实例来演示一下如何使用__autoload()来完成MVC模式下的单点入口结构。
这是我一个流量分析系统的整体结构
DSC0000.jpg 大家可以很清晰的看到,整个系统下面只有index.php文件作为调度文件,你可以暂时把他理解成一个工厂的传达室。
cache是smarty模版的缓存文件目录.
compile是模版编译过后的暂存文件
images存放图片素材和CSS样式表
lib库文件存放目录核心目录之一
smarty模版主目录
tpl存放的是HTML静态模版,当然在必要的时候也做一些简单的判断。
www整站系统的核心目录。
我们先看一下index.php 里面的内容
<?php
/*
############################网站流量分析系统页面注释##########################
系统核心文件,包含实例化一个smarty对象
根据GET得到的参数来选择调用哪一个程序页面
*/
//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进行执行和运算。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104896-1-1.html 上篇帖子: php开发过程中关于继承的使用方法 下篇帖子: PHP php-xml
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表