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 相关文章推荐
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
php在字符串中查找另一个字符串
Nov 19 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
PHP学习 变量使用总结
Mar 24 PHP
php采集文章中的图片获取替换到本地(实现代码)
Jul 08 PHP
thinkphp 一个页面使用2次分页的实现方法
Jul 15 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP的PDO常用类库实例分析
Apr 07 PHP
Laravel下生成验证码的类
Nov 15 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
Jun 19 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 COOKIE设置为浏览器进程
2009/06/21 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP 实现公历日期与农历日期的互转换
2017/09/13 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
js function定义函数的几种不错方法
2014/02/27 Javascript
Javascript Objects详解
2014/09/04 Javascript
JavaScript中获取高度和宽度函数总结
2014/10/08 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
微信js-sdk地理位置接口用法示例
2016/10/12 Javascript
domReady的实现案例
2016/11/23 Javascript
jQuery 判断元素整理汇总
2017/02/28 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
python虚拟环境迁移方法
2019/01/03 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
JMS中Topic和Queue有什么区别
2013/05/15 面试题
教职工代表大会主持词
2014/04/01 职场文书
2014年学校安全工作总结
2014/11/13 职场文书
高一军训决心书
2015/02/05 职场文书
立春观后感
2015/06/18 职场文书
教师读书笔记
2015/06/29 职场文书