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数据库开发知多少
Oct 09 PHP
无数据库的详细域名查询程序PHP版(1)
Oct 09 PHP
我的论坛源代码(五)
Oct 09 PHP
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
php whois查询API制作方法
Jun 23 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
php设计模式小结
Feb 15 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
Jan 11 PHP
基于CI框架的微信网页授权库示例
Nov 25 PHP
PHP 无限级分类
May 04 PHP
浅谈PHP错误类型及屏蔽方法
May 27 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 array_map()数组函数使用说明
2011/07/12 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
php里array_work用法实例分析
2015/07/13 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
javascript之典型高阶函数应用介绍二
2013/01/10 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
2017/09/30 Javascript
webpack4打包vue前端多页面项目
2018/09/17 Javascript
layDate插件设置开始和结束时间
2018/11/15 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
浅谈Three.js截图并下载的大坑
2019/11/01 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
python实现类之间的方法互相调用
2018/04/29 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
使用pip安装python库的多种方式
2019/07/31 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python实现大数据收集至excel的思路详解
2020/01/03 Python
python和php哪个容易学
2020/06/19 Python
木马的传播途径主要有哪些
2016/04/08 面试题
Servlet都有哪些方法?主要作用是什么?
2014/03/04 面试题
党员活动日总结
2014/05/05 职场文书
建材投资建议书
2014/05/16 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
个人租房协议书
2014/11/28 职场文书
优秀员工推荐材料
2014/12/20 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
python实现简单的井字棋
2021/05/26 Python