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 相关文章推荐
PHP图片上传类带图片显示
Nov 25 PHP
PHP 实例化类的一点摘记
Mar 23 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
一个好用的PHP验证码类实例分享
Dec 27 PHP
php购物车实现方法
Jan 03 PHP
腾讯CMEM的PHP扩展编译安装方法
Sep 25 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
php+jQuery递归调用POST循环请求示例
Oct 14 PHP
php实现文件与16进制相互转换的方法示例
Feb 16 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
php 根据自增id创建唯一编号类
Apr 06 PHP
PHP 加密 Password Hashing API基础知识点
Mar 02 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 stream_context_create()函数的使用示例
2015/05/12 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
Vue条件循环判断+计算属性+绑定样式v-bind的实例
2018/09/18 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
对Python闭包与延迟绑定的方法详解
2019/01/07 Python
解决Python3下map函数的显示问题
2019/12/04 Python
构建高效的python requests长连接池详解
2020/05/02 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
python调用win32接口进行截图的示例
2020/11/11 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
后进生转化工作制度
2014/01/17 职场文书
12岁生日感言
2014/01/21 职场文书
校园公益广告语
2014/03/13 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
2015年综治宣传月活动总结
2015/03/25 职场文书
校园广播稿范文
2015/08/19 职场文书