打造自己MVC框架
1、MVC概念
model view controller(控制器)
2、psr规范
psr1:基础编程规范
psr2:编码风格规范
psr3:日志接口规范
psr4:自动加载规范
3、命名规范
文件名和类名相同(大驼峰原则)IndexController
命名空间名和文件夹名相同(全部小写)
4、单一入口(简单路由)
index.php?m=index&a=index
pathinfo index.php/index/index
spl_autoload_register(__autoload)
5、框架目录架构
app
model UserModel.php
view
controller Controller.php UserController.php
config config.php
vendor
lib
framework
src
Model.php Page.php Tpl.php
public
css js fonts editor
cache 缓存
6、命名空间映射
model->app/model
controller=.>app/controller
framework=>vendor/lib/framework/src
简单的MVC框架
<?php
//index.php?m=index&a=index
class Psr4AutoLoad{
function __construct(){
spl_autoload_register([$this,'autoload']);//自动加载
}
function autoload($className){
//echo $className;
//根据类名找到文件全路径并且include进来
$filePath=str_replace('\\','/',$className).'.php';//将\\用/替换掉加上类名在加上.php
//echo $filePath;
include $filePath;//引入路径
}
}
$psr=new Psr4AutoLoad();
//得到控制器名字和方法
$m=$_GET['m'];
//完整的类名就是命名空间名在拼接类名
$className='controller\\'.ucfirst(strtolower($m)).'Controller';//首字母大写,最后得到IndexController
//根据类名创建对象
$obj=new $className();
//方法名
$a=$_GET['a'];
call_user_func([$obj,$a]);
复杂的MVC框架,涉及到一个命名空间和路径的映射
<?php
include 'bootstrap/Psr4AutoLoad.php';
class Psr4AutoLoad{
protected $mps[];//这里面存放命名空间映射
function __construct(){
spl_autoload_register([$this,'autoload']);
}
function autoload($className){
//自己写的自动加载函数
//完整的类名由命名空间名和类名组成
//得到命名空间名,根据命名空间名得到起目录路径
$pos=strrpos($className,'\\');
$namespace=substr($className,0,$pos);
$realClass=substr($className,$pos+1);//得到类名
//找到文件并且包含进来
$this->mapLoad($namespace,$realClass);
}
protected function mapLoad($namespace,$realClass){
//根据命名空间名得到目录路径并且拼接正真的文件全路径
if(array_key_exists($namespace,$this->maps)){
$namespace=$this->maps[$namespace];
}
//处理路径
$namespace=rtrim(str_replace('\\/','/',$namespace),'/').'/';
//拼接文件全路径
$filePath=$namespace.$realClass.'.php';
//将该文件包含进来
if(file_exists($filePath)){
include $filePath;
}else{
die('文件不存在');
}
}
function addMaps($namespace,$path){
//给一个命名空间各一个路径,将命名空间和路径保存在映射数组中
if(array_key_exists($namespace,$this->maps)){
die('此名名空间已经映射过');
}
$this->maps[$namespace]=$path;//将命名空间和路径一键值对形式存放到数组中
}
}
$psr=new Psr4AutoLoad();
$psr->addMaps('controller','app/controller');//添加命名空间映射
//从url中获取要执行的那个控制器中的那个方法
$m=empty($_GET['m'])?'index':$_GET['m'];
$a=empty($_GET['a'])?'index':$_GET['a'];//从get参数中获取,如果没有默认都是index
$_GET['m']=$m;
$_GET['a']=$a;
$m=ucfirst(strtolower($m));
//拼接带命名空键的类名
$controller='controller\\'.$m.'Controller';
$obj=new $controller();
call_user_func([$obj,$a]);
?>