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

打造自己的MVC框架相关推荐

  1. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)(转)

    阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...

  2. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  3. MVC框架的原理详解

    阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...

  4. php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]

    PHP培训教程教你快速打造PHP MVC框架[PHP基础教程] 简介 MVC框架在现在的开发中相当流行,不论你使用的是JAVA,C#,PHP或者IOS,你肯定都会选择一款框架.虽然不能保证100%的开 ...

  5. StarlingMVC:为Starling量身打造的MVC框架

    详细了解StarlingMVC框架,请登录其官方站点: http://creativebottle.github.com/starlingMVC/ 以下中文翻译转自Starling中文站,仅供部分参考 ...

  6. JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...

  7. 开源:Taurus.MVC 框架 (已支持.NET Core)

    为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...

  8. ASP.NET MVC框架(第一部分)

    [原文地址]ASP.NET MVC Framework (Part 1) [原文发表日期] Tuesday, November 13, 2007 3:45 AM 两个星期前, 我在博客里讨论了ASP. ...

  9. [轉]最流行的PHP MVC框架

    From : http://yp.oss.org.cn/software/show_resource.php?resource_id=742 本文给大家介绍一下国外最流行的基于MVC设计模式的PHP框 ...

最新文章

  1. HBase MetaStore和Compaction剖析
  2. 获取SQL Server 2000数据库和表空间使用信息
  3. 计算机组装与维护补考论文,计算机组装与维护期末论文
  4. 客户机操作系统已禁用 cpu。请关闭或重置虚拟机。_黑科技教学丨Win10竟然内置了一台虚拟机?教你如何玩转它...
  5. 最近对latin-1这个字符集产生了不少好感
  6. 数据库中char, varchar, nvarchar的差异
  7. 信息学奥赛一本通 1919:【02NOIP普及组】选数 | 洛谷 P1036 [NOIP2002 普及组] 选数
  8. 自然数的拆分(信息学奥赛一本通-T1318)
  9. 2021年下半年网络规划设计师下午真题及答案解析
  10. arm linux 页表寻址,操作系统中的页表寻址
  11. 【原创】3大主流的移动应用方式APP开发姿势解读
  12. 抽象代数的代码实现(1) 置换群
  13. Instead Of 触发器
  14. rasp java tomcat_Java安全之JNI绕过RASP
  15. 用python模拟一个文本浏览器来抓取网页
  16. markdown中插入数学公式
  17. Python数据分析_第06课:数据清洗与初步分析_笔记
  18. HTML期末大作业—— 游戏网页(5个页面) ~ 全屏游戏美术大赛作品征集网页 HTML+CSS+JS ~ web课程设计网页规划与设计...
  19. Echarts-水球图笔记
  20. 2W销量Steam大神,光临联盟微信群,近距离分享成功之路!(聊天实录)

热门文章

  1. Python 之正则表达re.compile()与re.findall()详解
  2. C语言实现简单小游戏---扫雷
  3. 面经—CV秋招40万+offer上岸经验:分享100道CV最新面试题
  4. Oracle Data Guard搭建——Physical Standby Database
  5. elementui穿梭框数据不更新
  6. Android电池矫正方法
  7. 数据清洗的几种常用手段
  8. 如何使用 Django 进行分页
  9. 【Java】子类列表和父类列表能否互相赋值与添加
  10. 中国电子竞技市场:外国玩家的机遇与挑战