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 开发工具
Dec 06 PHP
数字转英文
Dec 06 PHP
PHP4中session登录页面的应用
Jul 25 PHP
php函数的常用方法及注意之处小结
Jul 10 PHP
解析php中die(),exit(),return的区别
Jun 20 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
PHP日期函数date格式化UNIX时间的方法
Mar 19 PHP
php实现学生管理系统
Mar 21 PHP
PHP 实现从数据库导出到.csv文件方法
Jul 06 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
Sep 17 PHP
imagettftext() 失效,不起作用
Mar 09 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
5种PHP创建数组的实例代码分享
2014/01/17 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
PHP Yaf框架的简单安装使用教程(推荐)
2016/06/08 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
jquery win 7透明弹出层效果的简单代码
2013/08/06 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
Python实现提取文章摘要的方法
2015/04/21 Python
python实现实时监控文件的方法
2016/08/26 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
Python socket模块实现的udp通信功能示例
2019/04/10 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
想学画画?python满足你!
2020/12/24 Python
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
博士学位自我鉴定范文
2013/12/26 职场文书
修辞手法有哪些?
2019/08/29 职场文书
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers
关于Python中进度条的六个实用技巧分享
2022/04/05 Python