打造自己的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]);
?>
打造自己的MVC框架相关推荐
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)(转)
阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- MVC框架的原理详解
阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHandler.IHttpHandler.MvcHandler的说明 2.IHttpHandler解析 3.Mvc ...
- php mvc教程 文档,PHP培训教程教你快速打造PHP MVC框架[PHP基础教程]
PHP培训教程教你快速打造PHP MVC框架[PHP基础教程] 简介 MVC框架在现在的开发中相当流行,不论你使用的是JAVA,C#,PHP或者IOS,你肯定都会选择一款框架.虽然不能保证100%的开 ...
- StarlingMVC:为Starling量身打造的MVC框架
详细了解StarlingMVC框架,请登录其官方站点: http://creativebottle.github.com/starlingMVC/ 以下中文翻译转自Starling中文站,仅供部分参考 ...
- JavaScript MVC框架PK:Angular、Backbone、CanJS与Ember
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- 开源:Taurus.MVC 框架 (已支持.NET Core)
为什么要创造Taurus.MVC: 记得被上一家公司忽悠去负责公司电商平台的时候,情况是这样的: 项目原版是外包给第三方的,使用:WebForm+NHibernate,代码不堪入目,Bug无限,经常点 ...
- ASP.NET MVC框架(第一部分)
[原文地址]ASP.NET MVC Framework (Part 1) [原文发表日期] Tuesday, November 13, 2007 3:45 AM 两个星期前, 我在博客里讨论了ASP. ...
- [轉]最流行的PHP MVC框架
From : http://yp.oss.org.cn/software/show_resource.php?resource_id=742 本文给大家介绍一下国外最流行的基于MVC设计模式的PHP框 ...
最新文章
- HBase MetaStore和Compaction剖析
- 获取SQL Server 2000数据库和表空间使用信息
- 计算机组装与维护补考论文,计算机组装与维护期末论文
- 客户机操作系统已禁用 cpu。请关闭或重置虚拟机。_黑科技教学丨Win10竟然内置了一台虚拟机?教你如何玩转它...
- 最近对latin-1这个字符集产生了不少好感
- 数据库中char, varchar, nvarchar的差异
- 信息学奥赛一本通 1919:【02NOIP普及组】选数 | 洛谷 P1036 [NOIP2002 普及组] 选数
- 自然数的拆分(信息学奥赛一本通-T1318)
- 2021年下半年网络规划设计师下午真题及答案解析
- arm linux 页表寻址,操作系统中的页表寻址
- 【原创】3大主流的移动应用方式APP开发姿势解读
- 抽象代数的代码实现(1) 置换群
- Instead Of 触发器
- rasp java tomcat_Java安全之JNI绕过RASP
- 用python模拟一个文本浏览器来抓取网页
- markdown中插入数学公式
- Python数据分析_第06课:数据清洗与初步分析_笔记
- HTML期末大作业—— 游戏网页(5个页面) ~ 全屏游戏美术大赛作品征集网页 HTML+CSS+JS ~ web课程设计网页规划与设计...
- Echarts-水球图笔记
- 2W销量Steam大神,光临联盟微信群,近距离分享成功之路!(聊天实录)