为了达到更快的开发效率,我们可以根据mvc思想来封装属于我们自己的框架
首先我们先来一起回顾下MVC模式的目的,mvc是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。
那么我们应该怎么封装mvc框架呢?我们可以先了解一下框架运行流程:
1.入口文件
2.定义常量
3.引入函数库
4.自动加载类
5.启动框架
6.路由解析
7.加载控制器
8.返回结果
这是封装一个框架的运行流程;
接下来我们开始封装
一、新建一个项目入口文件,在入口文件中我们需要做的有:1..定义常量 2.加载函数库 3.启动框架:
我们要定义当前框架所在的根目录,
定义框架的核心文件所处的目录,
定义项目文件(控制器 模型)所在的目录
定义是否开启调错模式;
二、加载函数库
//加载函数库
include CORE.'/common/function.php';
注意 :这里的CORE是项目的文件夹 ,是核心目录结构 函数库common
三、 设置类为静态方法,开始启动框架
include './core/imooc.php';
\core\imooc::run();
<img src="https://img-blog.youkuaiyun.com/20160929123907059?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
运行后如果输出OK ,则入口文件成功完成!
四、自动加载类库
在基础类中放入一个load方法,用来自动加载类库
public static $classMap=array();
static public function load($class)
{
//自动加载类库
//new \core\route();
//$class='\core\route';
//MPK.'/core/route.php';
// var_dump($class);
// var_dump(MPK .'/'. $class . '.php');
if(isset($classMap[$class])){//判断类是否存在
return true;
}else{
$class=str_replace('\\','/',$class);
if(is_file(MPK .'/'. $class . '.php')){
include MPK .'/'. $class . '.php';//拼接类文件
self::$classMap[$class]=$class;
}else{
return false;
}
}
在core文件夹建立路由文件route,给它一个命名空间,
为了加载load方法里面的类库,我们可以在入口文件进 行自动加载
spl_autoload_register('\core\imooc::load');//不存在的类会加载
如果输出路由类的OK ,则自动加载成功!
五、当网址是xxxxxxx.com/index/index时,访问的是index控制器,index方法
1.首先要隐藏index.php;
在根目录建立一个.htaccess文件
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>
再次访问则可以隐藏index.php
2.获取URL的参数部分
通过打印$_SERVER获取到需要的数据
3.返回对应控制器和方法
if(isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI'] !='/')
{
$path=$_SERVER['REQUEST_URI'];
$patharr=explode('/',trim($path,'/'));
if(isset($patharr[0])){
$this->ctrl=$patharr[0];
}
unset($patharr[0]);
if(isset($patharr[1])){
$this->action=$patharr[1];
unset($patharr[1]);
} else{
$this->action='index';
}
// var_dump($patharr);
// url多余部分转为_GET
$count = count($patharr)+2;
$i=2;
while($i <$count){
if(isset($patharr[$i+1])){
$_GET[$patharr[$i]] = $patharr[$i + 1];
}
$i=$i+2;
}
print_r($_GET);
}else{
$this->ctrl='index';
$this->action='index';
}
// var_dump($_SERVER['REQUEST_URI']);
}
可以输入index/id/2....等来验证打印结果