php实现简单的MVC框架实例


Posted in PHP onSeptember 23, 2015

本文实例讲述了php实现简单的MVC框架。分享给大家供大家参考。具体如下:

在开始之前需要知道的知识

1.php基础知识

2.单一入口, 不知道的可以看看这里 (https://3water.com/article/72621.htm)

具备以上两点, 那我们就可以开始啦. 哈哈!

先来说一下程序的执行流程

首先有个入口文件, 然后初始化一些程序, 之后根据请求调用不同的类和方法

首先我们弄一个入口文件 Index.php 来看看代码

<?php
require "Init.php";
$control = new Controller();
$control->Run();
?>

代码没什么特别的, 首先先引入Init.php文件 然后实例化一个类

然后调用该类的Run()方法 这里我们把这个类叫做控制器

既然引入了Init.php文件, 那么我们继续看看Init.php文件的源码

<?php
header("Content-type:text/html;charset=utf-8"); 
!defined('ROOT_PATH') && define('ROOT_PATH', str_replace('\\', '/', dirname(__FILE__)));
require ROOT_PATH . '/Core/Config.php';  //引入配置文件
require ROOT_PATH . '/Core/Controller.class.php'; //引入控制器类文件
require ROOT_PATH . '/Core/View.class.php';  //视图类文件
require ROOT_PATH . '/Core/Model.class.php';  //模型类文件
?>

分析一下代码, 如果你懂了, 可以略过这一步, 继续往下看哦.

首先 设置字符集, 然后判断如果没有定义常量"ROOT_PATH"那么就定义它

然后就是引入一些文件, 首先是配置文件, 控制器类文件, 视图类文件, 模型类文件

同理既然引入了文件,那么我们就打开文件看看代码, 先来看Config.php文件

<?php
$C = array(
 'URL_MODE' => 1, //URL模式, 1普通模式, 2 PATH_INFO模式
 'DEFAULT_CONTROL' => 'welcome', //默认调用的控制器
 'DEFAULT_ACTION' => 'index', //默认执行的方法
);
?>

没什么特别的就是一个数组, 有三个值, 暂时先这样, 以后有需要在来增加

那么好, 我们继续看Controll.class.php

<?php
class Controller
{
 public function Run()
 {
 $this->Analysis(); //开始解析URL获得请求的控制器和方法
 $control = $_GET['c'];
 $action = $_GET['a'];
 //这里构造出控制器文件的路径
 $controlFile = ROOT_PATH . '/Controllers/' . $control . '.class.php';
 if(!file_exists($controlFile)) //如果文件不存在提示错误, 否则引入
 {
  exit('控制器不存在' . $controlFile);
 }
 include($controlFile);
 $class = ucwords($control); //将控制器名称中的每个单词首字母大写,来当作控制器的类名
 if(!class_exists($class))  //判断类是否存在, 如果不存在提示错误
 {
  exit('为定义的控制器类' . $class);
 }
 $instance = new $class(); //否则创建实例
 if(!method_exists($instance, $action)) //判断实例$instance中是否存在$action方法, 不存在则提示错误
 {
  exit('不存在的方法' . $action);
 }
 $instance->$action();
 }
 protected function Analysis()
 {
 global $C;  //包含全局配置数组, 这个数组是在Config.ph文件中定义的
 if($C['URL_MODE'] == 1) //如果URL模式为1 那么就在GET中获取控制器, 也就是说url地址是这种的http://localhost/index.php?c=控制器&a=方法
 {
  $control = !empty($_GET['c']) ? trim($_GET['c']) : '';
  $action = !empty($_GET['a']) ? trim($_GET['a']) : '';
 }
 else if($C['URL_MODE'] == 2) //如果为2 那么就是使用PATH_INFO模式, 也就是url地址是这样的 http://localhost/index.php/控制器/方法/其他参数
 {
  if(isset($_SERVER['PATH_INFO']))
  {
  //$_SERVER['PATH_INFO']URL地址中文件名后的路径信息, 不好理解, 来看看例子
  //比如你现在的URL是 http://localhost/index.php 那么你的$_SERVER['PATH_INFO']就是空的
  //但是如果URL是 http://localhost/index.php/abc/123
  //现在的$_SERVER['PATH_INFO']的值将会是 index.php文件名称后的内容 /abc/123/
  $path  = trim($_SERVER['PATH_INFO'], '/');
  $paths  = explode('/', $path);
  $control = array_shift($paths);
  $action = array_shift($paths);
  }
 }
 //这里判断控制器的值是否为空, 如果是空的使用默认的
 $_GET['c'] = $control = !empty($control) ? $control : $C['DEFAULT_CONTROL'];
 //和上面一样
 $_GET['a'] = $action = !empty($action) ? $action : $C['DEFAULT_ACTION'];
 }
}
?>

注释写的很清楚, 这里我就不多说了, 做到这, 你就可以建立一个Controller目录, 然后在目录中建立welcome.class.php文件

写入如下内容

<?php
class Welcome
{
 public function index()
 {
 echo 'Hello';
 }
}
?>

允许程序你将会看到Hello

然后在写一个方法

<?php
class Welcome
{
 public function index()
 {
 echo 'Hello';
 }
 public function show()
 {
 echo '方法名称Show';
 }
}
?>

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
打造计数器DIY三步曲(上)
Oct 09 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
Aug 21 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
May 04 PHP
php登陆页的密码处理方式分享
Oct 14 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
PHP使用逆波兰式计算工资的方法
Jul 29 PHP
详解php中反射的应用
Mar 15 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
PHP根据session与cookie用户登录状态操作类的代码
May 13 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
PHP中STDCLASS用法实例分析
Nov 11 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
php实现的单一入口应用程序实例分析
Sep 23 #PHP
PHP中常见的缓存技术实例分析
Sep 23 #PHP
PHPStrom中实用的功能和快捷键大全
Sep 23 #PHP
PHP提高编程效率的20个要点
Sep 23 #PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 #PHP
php设置页面超时时间解决方法
Sep 22 #PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
Sep 22 #PHP
You might like
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
2016/12/29 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
javascript延时重复执行函数 lLoopRun.js
2007/06/29 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
Javascript 按位取反运算符 (~)
2014/02/04 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
jQuery中on()方法用法实例
2015/01/19 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
JQuery省市联动效果实现过程详解
2020/05/08 jQuery
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
[38:44]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第二局
2016/02/25 DOTA
[00:10]神之谴戒
2019/03/06 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
Python实现数据库编程方法详解
2015/06/09 Python
Python实现单词翻译功能
2017/06/06 Python
python 实现提取某个索引中某个时间段的数据方法
2019/02/01 Python
10款最好的Python开发编辑器
2019/07/03 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
css实例教程 一款纯css3实现的超炫动画背画特效
2014/11/05 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
公司出纳岗位职责
2013/12/07 职场文书
不错的求职信范文
2014/07/20 职场文书
承诺书模板
2014/08/30 职场文书
活动费用申请报告
2015/05/15 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS