php is_dir 浅解用PHP实现MVC

php is_dir 浅解用PHP实现MVC

MVC是一个老生常谈的问题,是为了解决一类共同问题总结出来的一套可复用的解决方案,这是软件设计模式产生的初衷。不管是客户端还是移动端,MVC的分层设计模式解决了软件开发中的可复用、单一职责、解耦的问题php is_dir,PHP语言中的MVC设置模式也是如此。下面通过PHP语言细说MVC模式如何在PHP中应用,本文主要从如下几方面介绍:

Ø MVC的工作原理

Ø PHP开发框架

a) 开发框架的优势

b) 使用框架进行模块划分

Ø 一个简单MVC框架总体架构分析

a) URL访问方式【URL 】

b) 控制器【】

c) 视图【View】

d) 运行时【】

1、MVC 的工作原理

MVC框架图:

视图View

代表用户交互的页面、可以包含HTML界面、模板等和界面相关的元素。MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的点击、拖动等事件的处理,而不包括在视图上的业务流程处理。业务流程会交给模型层(Model)处理。

模型Model

模型层是对业务流程、状态的处理以及业务规则的指定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图的请求处理数据,返回最终的处理结果。业务模型还有一个很重要的模型–数据模型,数据模型主要指实体对象的数据保存(持久化)。比如将一张订单保存到数据库,从数据库获取订单,所有和数据库相关的操作限定在该模型中。

控制器

控制层是View层和Model层之间的一个桥梁,接收到用户的请求,将模型和视图匹配在一起,共同完成用户的请求。比如,用户点击一个链接,控制层接收到请求后,把信息传递给模型层,模型层处理完成之后返回视图给用户。

2、PHP开发框架

2.1、开发框架的优势

2.2、使用框架进行模块划分

一个典型的后台应用模块的划分

系统管理频道内容管理频道用户管理频道

模块设置操作

3、一个简单MVC框架的分析

从以下五个方面来分析

URL访问方式(URL )控制器()视图(View)模型(Model)运行时()

3.1、URL访问方式(URL )

URL使用模式(index.php/index/index/),应用的访问方式都是采用单一入口的访问方式,所有访问一个应用中的具体模块及模块中的某个操作,都需要在URL中通过入口文件后的参数来访问和执行php is_dir 浅解用PHP实现MVC,所有访问都会变成由URL的参数来统一解析和调度,格式如下:

不带参数的URL

带有参数的URL

这种采用单一入口和模式的URL访问是MVC实现的基础,作为单一入口的框架的入口.php文件则负责处理基本的信息,包括了

1)路径信息处理

路径信息会保存在$全局数组中,后面的页面需要使用到直接从$中获取即可

//模板文件中所有要的路径,htmlcss\imagelink等中用到的路径php is_dirphp is_dir 浅解用PHP实现MVC,从WEB服务器的文档根开始

$spath = ($

“”

);

if ($spath == “/” || $spath == “\”)

$spath = “”;

$ = $spath . '/'; //Web服务器根到项目的根

$ = $

“”

. '/'; //当前应用脚本文件

$ = $ . $_GET . '/'; //访问到当前模块

$ = $ . '/'; //项目的全局资源目录

$ = $ . ltrim(, './') . “views/” . . “//”; //当前应用模板的资源

2)包含框架中的函数库文件

函数库文件主要是一些常用的工具方法的集合,框架自带的.inc.php方法库包含了数据模型创建操作的一些列工具方法,可以开箱即用。此外用户也可以自定义函数库文件保存在对应模块目录下的/.inc.php位置,框架会自动引入。

 //包含框架中的函数库文件
 include BROPHP_PATH . 'commons/functions.inc.php';
 ​
 // 包含全局的函数库文件,用户可以自己定义函数在这个文件中
 $funfile = PROJECT_PATH . "commons/functions.inc.php";
 if (file_exists($funfile))
 include $funfile;

3)设置包含目录(类所在的全部目录)

这个步骤是()自动加载类的基础,()方法中会自动从这些目录中寻找要包含的类

 //设置包含目录(类所在的全部目录), PATH_SEPARATOR 分隔符号 Linux(:) Windows(;)
 $include_path = get_include_path(); //原基目录
 $include_path .= PATH_SEPARATOR . BROPHP_PATH . "bases/"; //框架中基类所在的目录
 $include_path .= PATH_SEPARATOR . BROPHP_PATH . "classes/"; //框架中扩展类的目录
 $include_path .= PATH_SEPARATOR . BROPHP_PATH . "libs/"; //模板Smarty所在的目录
 $include_path .= PATH_SEPARATOR . PROJECT_PATH . "classes/"; //项目中用的到的工具类
 $controlerpath = PROJECT_PATH . "runtime/controls/" . TMPPATH; //生成控制器所在的路径
 $include_path .= PATH_SEPARATOR . $controlerpath; //当前应用的控制类所在的目录
 //设置include包含文件所在的所有目录
 set_include_path($include_path);

4)()自动加载类

()魔术方法是在用户创建一个没有包含的类的对象之前会调用,所以重写这个方法,在这个方法中处理类文件的包含,省去了类文件包含的工作,当然类名需要符合一定的规则才能使用自动包含,框架定义了类名的规则为“首字母大小的类名.clsss.php”

 //自动加载类
 function __autoload($className)
 {
 if ($className == "memcache") { //如果是系统的Memcache类则不包含
 return;
 } else if ($className == "Smarty") { //如果类名是Smarty类,则直接包含
 include "Smarty.class.php";
 } else { //如果是其他类,将类名转为小写
 include strtolower($className) . ".class.php";
 }
 Debug::addmsg(" $className 类", 1); //在debug中显示自动包含的类
 }

解析处理URL

解析处理URL步骤调用的是::();

 /**
 * URL路由,转为PATHINFO的格式
 */

php is_dir

static function parseUrl() { if (isset($_SERVER['PATH_INFO'])) { //获取 pathinfo $pathinfo = explode('/', trim($_SERVER['PATH_INFO'], "/")); ​ // 获取 control $_GET['m'] = (!empty($pathinfo[0]) ? $pathinfo[0] : 'index'); ​ array_shift($pathinfo); //将数组开头的单元移出数组 ​ // 获取 action $_GET['a'] = (!empty($pathinfo[0]) ? $pathinfo[0] : 'index'); array_shift($pathinfo); //再将将数组开头的单元移出数组 ​ for ($i = 0; $i < count($pathinfo); $i += 2) { $_GET[$pathinfo[$i]] = $pathinfo[$i + 1]; } ​ } else { $_GET["m"] = (!empty($_GET['m']) ? $_GET['m'] : 'index'); //默认是index模块 $_GET["a"] = (!empty($_GET['a']) ? $_GET['a'] : 'index'); //默认是index动作 ​ if ($_SERVER["QUERY_STRING"]) { $m = $_GET["m"]; unset($_GET["m"]); //去除数组中的m $a = $_GET["a"]; unset($_GET["a"]); //去除数组中的a $query = http_build_query($_GET); //形成0=foo&1=bar&2=baz&3=boom&cow=milk格式 //组成新的URL $url = $_SERVER["SCRIPT_NAME"] . "/{$m}/{$a}/" . str_replace(array("&", "="), "/", $query); header("Location:" . $url); } } }

访问login/index,解析保存在全局的GET数组中的信息如下:

m -> 表示控制器

a -> 表示操作

有了这些信息,动态创建控制器,发起对应的流程

 $className = ucfirst($_GET["m"]) . "Action";
 $controler = new $className();
 $controler->run();

3.2、控制器()

1)控制器的声明

功能模块的控制器类保存在目录中,类名和模块名相同,下面是登录模块,定义一个Login类(类的首字母需要大写)保存的文件名为login.class.php

 class Login extends Action
 {
 function __construct()
 {
 parent::__construct();
 }
 ​
 function index()
 {//登陆页面
 $GLOBALS['debug'] = 0;
 $this->display();
 }
 function islogin()
 {
 if ($_POST['user_username'] == null && $_POST['user_password'] == null) {//如果用户名为空
 $this->error('用户名和密码不能为空', 1, '');
 }
 $_POST['user_password'] = md5($_POST['user_password']);
 $_POST['user_repassword'] = md5($_POST['user_repassword']);
 if ($_POST['user_repassword'] != $_POST['user_password']) {//如果用户输入的两次密码不一致

php is_dir

$this->error('两次密码不一致', 1, ''); } $user = D('user'); $date = $user->field('uid,user_password')->where(array('user_username' => $_POST['user_username']))->find(); $_POST['uid'] = $date['uid']; if ($_POST['user_password'] != $date['user_password']) {//如果输入的密码与数据库密码不匹配 $this->error('密码不正确', 1, ''); } if (strtoupper($_POST['code']) != $_SESSION['code']) {//如果输入的验证码不正确 $this->error('验证码输入不正确', 1, ''); } $_SESSION = $_POST;//把posts所有的数据压入session $date = $user->query('SELECT free_user_group.group_muser,free_user_group.group_mweb,free_user_group.group_marticle,free_user_group.group_sendarticle,free_user_group.group_mimage,free_user_group.group_sendcomment,free_user_group.group_sendmessage,free_user.user_lock FROM free_user,free_user_group WHERE free_user.uid=' . $_SESSION['uid'] . ' AND free_user.gid=free_user_group.gid', 'select'); if ($date[0]['user_lock']) { $this->error('您的帐号已被锁定,请与管理员联系后再登录', 3, 'index/index'); } else { if ($date[0]['group_muser'] || $date[0]['group_marticle'] || $date[0]['group_mweb'] || $date[0]['group_mimage']) { //查询数据库中是否开启自动记录操作 $opernote = D('foreground'); //$_SESSION['oper']=D('OperDate'); $isOpenNote = $opernote->where(array('fid' => '1'))->field('operateNotes')->find(); //$_SESSION['operAuthor']=$operAuthior->where(array('id'=>'1'))->find(); $_SESSION['isOpenNotes'] = $isOpenNote['operateNotes']; $_SESSION['islogin'] = true; $_SESSION = array_merge($date[0], $_SESSION); $user->where($_SESSION['uid'])->update('user_onlinestatus=user_onlinestatus+1'); $this->success('登陆成功', 1, 'index/index'); } else { $this->error('您的权限不够无法进入后台', 1, ''); } } } function logout() {//退出时销毁session $user = D('user'); $_SESSION['islogin'] = false; $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setCookie(session_name(), '', time() - 3600, '/'); } session_destroy(); $this->redirect('index'); } ​ function code() {//显示验证码 echo new Vcode(); } }

.class.php 类

 class Common extends Action
 {
 function init()
 {
 if (!(isset($_SESSION['islogin']) && $_SESSION['islogin'] == true)) {
 $this->redirect("login/index");
 }
 $this->assign('session', $_SESSION);
 }
 }

2) 操作的声明

每个操作对应的是控制器中的一个方法,比如在上面的Login控制器中

3.3、视图(View)

视图的显示是基于模板引擎的php is_dir,继承了类,并且重写了,,, 方法。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » php is_dir 浅解用PHP实现MVC

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们