打造自己的MVC框架

打造自己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]);
?>


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值