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 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
php检测iis环境是否支持htaccess的方法
Feb 18 PHP
PHP常用函数和常见疑难问题解答
Mar 05 PHP
php堆排序实现原理与应用方法
Jan 03 PHP
php函数重载的替代方法--伪重载详解
May 08 PHP
android上传图片到PHP的过程详解
Aug 03 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
Apr 10 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 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 中文乱码解决办法总结分析
2009/07/30 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
PHP下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
jQuery使用手册之二 DOM操作
2007/03/24 Javascript
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
js中设置元素class的三种方法小结
2011/08/28 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
JS只能输入正整数的简单实例
2016/10/07 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
Python3 replace()函数使用方法
2018/03/19 Python
python实现简易动态时钟
2018/11/19 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
什么是接口(Interface)?
2013/02/01 面试题
党员的自我评价范文
2014/01/02 职场文书
高中生家长会演讲稿
2014/01/14 职场文书
社会学专业学生职业规划书
2014/02/07 职场文书
土木工程求职信
2014/05/29 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
廉政承诺书2015
2015/04/28 职场文书
基层党支部承诺书
2015/04/30 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
MySQL 服务和数据库管理
2021/11/11 MySQL