教程:使用PHP开发自己的MVC框架

合集下载

mvc框架 大纲 php

mvc框架 大纲 php

MVC(Model-View-Controller)是一种常见的软件设计模式,被广泛用于构建各种类型的应用程序。

在PHP中,有许多MVC框架可供选择,用于简化应用程序的开发和提高代码的可维护性。

以下是使用PHP MVC框架开发应用程序的基本大纲:1. 模型(Model):模型是应用程序的数据层,负责处理与数据相关的逻辑。

模型与数据库进行交互,执行数据的增删改查等操作。

在MVC框架中,模型是与数据库交互的组件,封装了数据访问逻辑。

2. 视图(View):视图是应用程序的界面层,负责展示数据给用户。

视图通常包含HTML、CSS和JavaScript等前端技术,用于呈现用户界面。

在MVC框架中,视图是与用户交互的组件,负责渲染和显示模型中的数据。

3. 控制器(Controller):控制器是应用程序的控制层,负责接收用户的请求并处理业务逻辑。

控制器接收用户的输入,调用模型进行数据处理,然后将结果传递给视图进行展示。

在MVC框架中,控制器是连接模型和视图的桥梁,负责处理用户请求并协调模型和视图之间的交互。

使用PHP MVC框架开发应用程序的基本步骤如下:1. 确定应用程序的需求和功能:在开始开发之前,需要明确应用程序的需求和功能,以便进行适当的架构设计和模块划分。

2. 选择合适的MVC框架:根据需求和功能选择适合的MVC框架。

一些流行的PHP MVC框架包括Laravel、Symfony、CodeIgniter等。

3. 创建模型:根据业务需求创建模型类,定义数据表和数据操作方法。

4. 创建视图:根据用户界面需求创建视图文件,使用HTML、CSS和JavaScript等技术进行界面设计。

5. 创建控制器:根据用户请求创建控制器类,处理业务逻辑并调用模型和视图进行交互。

6. 路由配置:配置路由规则,将URL路径映射到相应的控制器和操作方法。

7. 测试和调试:对应用程序进行测试和调试,确保功能正常工作并修复潜在的问题。

php实现简单的MVC框架实例

php实现简单的MVC框架实例

php实现简单的MVC框架实例本⽂实例讲述了php实现简单的MVC框架。

分享给⼤家供⼤家参考。

具体如下:在开始之前需要知道的知识1.php基础知识具备以上两点, 那我们就可以开始啦. 哈哈!先来说⼀下程序的执⾏流程⾸先有个⼊⼝⽂件, 然后初始化⼀些程序, 之后根据请求调⽤不同的类和⽅法⾸先我们弄⼀个⼊⼝⽂件 Index.php 来看看代码<?phprequire "Init.php";$control = new Controller();$control->Run();>代码没什么特别的, ⾸先先引⼊Init.php⽂件然后实例化⼀个类然后调⽤该类的Run()⽅法这⾥我们把这个类叫做控制器既然引⼊了Init.php⽂件, 那么我们继续看看Init.php⽂件的源码<?phpheader("Content-type:text/html;charset=utf-8");!defined('ROOT_PATH') && define('ROOT_PATH', str_replace('\\', '/', dirname(__FILE__)));require ROOT_PATH . '/Core/Config.php'; //引⼊配置⽂件require ROOT_PATH . '/Core/Controller.class.php'; //引⼊控制器类⽂件require ROOT_PATH . '/Core/View.class.php'; //视图类⽂件require ROOT_PATH . '/Core/Model.class.php'; //模型类⽂件>分析⼀下代码, 如果你懂了, 可以略过这⼀步, 继续往下看哦.⾸先设置字符集, 然后判断如果没有定义常量"ROOT_PATH"那么就定义它然后就是引⼊⼀些⽂件, ⾸先是配置⽂件, 控制器类⽂件, 视图类⽂件, 模型类⽂件同理既然引⼊了⽂件,那么我们就打开⽂件看看代码, 先来看Config.php⽂件<?php$C = array('URL_MODE' => 1, //URL模式, 1普通模式, 2 PATH_INFO模式'DEFAULT_CONTROL' => 'welcome', //默认调⽤的控制器'DEFAULT_ACTION' => 'index', //默认执⾏的⽅法);>没什么特别的就是⼀个数组, 有三个值, 暂时先这样, 以后有需要在来增加那么好, 我们继续看Controll.class.php<?phpclass Controller{public function Run(){$this->Analysis(); //开始解析URL获得请求的控制器和⽅法$control = $_GET['c'];$action = $_GET['a'];//这⾥构造出控制器⽂件的路径$controlFile = ROOT_PATH . '/Controllers/' . $control . '.class.php';if(!file_exists($controlFile)) //如果⽂件不存在提⽰错误, 否则引⼊{exit('控制器不存在' . $controlFile);}include($controlFile);$class = ucwords($control); //将控制器名称中的每个单词⾸字母⼤写,来当作控制器的类名if(!class_exists($class)) //判断类是否存在, 如果不存在提⽰错误{exit('为定义的控制器类' . $class);}$instance = new $class(); //否则创建实例if(!method_exists($instance, $action)) //判断实例$instance中是否存在$action⽅法, 不存在则提⽰错误{exit('不存在的⽅法' . $action);}$instance->$action();}protected function Analysis(){global $C; //包含全局配置数组, 这个数组是在Config.ph⽂件中定义的if($C['URL_MODE'] == 1) //如果URL模式为1 那么就在GET中获取控制器, 也就是说url地址是这种的http://localhost/index.php?c=控制器&a=⽅法 {$control = !empty($_GET['c']) ? trim($_GET['c']) : '';$action = !empty($_GET['a']) ? trim($_GET['a']) : '';}else if($C['URL_MODE'] == 2) //如果为2 那么就是使⽤PATH_INFO模式, 也就是url地址是这样的 http://localhost/index.php/控制器/⽅法/其他参数 {if(isset($_SERVER['PATH_INFO'])){//$_SERVER['PATH_INFO']URL地址中⽂件名后的路径信息, 不好理解, 来看看例⼦//⽐如你现在的URL是 http://localhost/index.php 那么你的$_SERVER['PATH_INFO']就是空的//但是如果URL是 http://localhost/index.php/abc/123//现在的$_SERVER['PATH_INFO']的值将会是 index.php⽂件名称后的内容 /abc/123/$path = trim($_SERVER['PATH_INFO'], '/');$paths = explode('/', $path);$control = array_shift($paths);$action = array_shift($paths);}}//这⾥判断控制器的值是否为空, 如果是空的使⽤默认的$_GET['c'] = $control = !empty($control) ? $control : $C['DEFAULT_CONTROL'];//和上⾯⼀样$_GET['a'] = $action = !empty($action) ? $action : $C['DEFAULT_ACTION'];}}>注释写的很清楚, 这⾥我就不多说了, 做到这, 你就可以建⽴⼀个Controller⽬录, 然后在⽬录中建⽴welcome.class.php⽂件写⼊如下内容<?phpclass Welcome{public function index(){echo 'Hello';}}>允许程序你将会看到Hello然后在写⼀个⽅法<?phpclass Welcome{public function index(){echo 'Hello';}public function show(){echo '⽅法名称Show';}}>希望本⽂所述对⼤家的php程序设计有所帮助。

php打造属于自己的MVC框架

php打造属于自己的MVC框架

php打造属于自己的MVC框架本篇先介绍一下php的MVC实现原理,我们框架的MVC部分也是基于此原理实现的,但是今天的代码并不是框架内的代码,仅仅为说明原理一、文件结构建立3个文件夹controller文件夹存放控制器文件view文件夹存放视图文件model文件夹存放数据文件建立1个index.php 作为唯一入口二、控制器我们在controller文件夹下建立一个democontroller.php文件,文件内容如下复制代码代码如下:<?phpclass DemoController{function index(){echo('hello world');}}/* End of file democontroller.php */这个文件里面我们只是建立了一个名为DemoController的对象并包含一个index的方法,该方法输出hello world。

下面在index.php中执行DemoController中index方法。

index.php的代码如下复制代码代码如下:<?phprequire('controller/democontroller.php');$controller=new DemoController();$controller->index();/* End of file index.php */运行index.php,ok如愿我们看到了我们久违的hello world。

这两个文件非常简单,但也揭示了一点点m vc的本质,通过唯一入口运行我们要运行的控制器。

当然controller部分应该是由uri来决定的,那么我们来改写一下index.php使他能通过uri来决定运行那个controller。

index.php改写代码如下:复制代码代码如下:<?php$c_str=$_GET['c'];//获取要运行的controller$c_name=$c_str.'Controller';//按照约定url中获取的controller名字不包含Controller,此处补齐。

51CTO学院-PHP打造属于自己的MVC框架实战视频课程

51CTO学院-PHP打造属于自己的MVC框架实战视频课程

51cto学院-PHP打造属于自己的MVC框架实战视频课程课程目标在本课程中你能够学会MVC的基本原理,MVC的路由机制,单例模式,PDO数据库操作类的封装,以及如何架构属于自己的MVC项目。

利用本课所学技能,能够独立搭建项目底层或开发一个小型的PHP框架!适用人群PHP爱好者,具有PHP基础及PHP面向对象相关知识的童鞋。

课程简介本课程重点讲解了当前主流MVC设计模式,以及MVC实际项目中的应用。

包含内容有MVC基本原理、MVC工作流、MVC的URL路由、spl _autoload_register加载类文件、单例模式、PDO方式封装MODEL类等;MVC底层搭建完成后会讲解一个“微吐槽”的项目,最后将讲解如何开发一个“个人博客”项目;通过这两个项目的讲解使你能够深入的理解及掌握MVC设计模式。

项目课程和本课程是独立分开的,请小伙伴们根据需要购买。

课程第一章课程简介1课时6分钟1课程简介[免费观看]6分钟课程所讲内容介绍。

第二章初识MVC2课时7分钟2开发工具介绍3分钟课程所使用的开发工具介绍及常用操作说明。

3什么是MVC?[免费观看]4分钟MVC介绍,MVC基本原理,为什么使用MVC三层架构。

第三章MVC底层框架搭建19课时3小时11分钟4MVC目录结构创建[免费观看]3分钟MVC项目目录结构创建5单一入口[免费观看]2分钟介绍什么是单一入口,单一入口给我们带来的好处等。

6URL路由之pathinfo路由[免费观看]10分钟讲解最熟悉的URL网页传参形式的pathinfo路由的实现及原理。

7隐藏index.php4分钟为什么要隐藏index.php,如何进行隐藏等。

8URL路由之重写URL路由14分钟重写形式URL路由的原理,如何进行实现。

9自动加载类文件10分钟项目会经常命名各种类,如果使用最原始的require或者include则会增加代码的冗余度,本节主要讲解如何注册自己的自动加载类方法。

php运用MVC模式

php运用MVC模式

如何在PHP中使用“MVC”设计模式去开发WEB应用如何在PHP中使用“MVC”设计模式去开发WEB应用呢?记住一点(代码和页面设计分开),用一个简单的例子演示一下,比如要从数据库中查询出会员的资料以显示在网页上,这里就需要考虑到两点:1.连接数据库并取出会员资料,2.把会员资料显示在网页上,连接数据库我们使用一个数据库的类,把它叫做“DB”类吧,这个类此时就扮演了“模型(Model)”的角色,接着我们需要编写一个操作“DB”类的程序以取出数据,这个程序所扮演的角色就是“控制器(Controller)”,它接受客户端“POST”或“PUT”的数据,然后再调用“DB”类以取出数据,把这些数据都存放在“控制器(Controller)”中,最后把数据传递给“视图(View)”并按照一定的排版格式显示出来,从上面的分析可以看出,模板在这里就是扮演了“视图(View)”的角色,当然仅仅一个模板类是不能说成是MVC的,真正的MVC不是这么简单的,具体可以参考一下“JSF”。

“3t”是一个模板类,主要是读取“控制器(Controller)”的数据并进行一些特殊处理,最后通过一些简单的模板语法把数据显示出来,它具有一些什么样的特点呢?解析速度快,可以根据需要选择使用html方式缓存或php方式缓存,当然你也可以不用缓存,同样可以实现快速稳定的WEB应用使用简单、安装操作方便,在数据的读取方面类似著名模板类“SMARTY”,在数据显示方面即类似“PHP的语法”又类似“JavaBeans”可扩展性好,你可以根据需要随时加入你想要的功能,因为它是开源的,在不久的日子里,将支持插件功能伸缩性好,支持最新的PHP5,只要你的PHP版本>=4.0.6即可使用,当然你需要有在服务器操作文件的权限功能强大,支持模板的多级嵌套,数组多级循环等等当然此模板还需完善的地方很多,有待在各种环境测试使用才能不断完善,目前仅在LINUX和WINDOWS 环境下测试通过.二.安装1.解压后应该可以看到如下目录结构:./3tx.x/cmp/ 编译后的文件(请确保此文件夹可读写)./3tx.x/tpl/ 模板文件(模板文件都放在这里,确保此文件夹可读)./3tx.x/che/ 缓存文件存放的文件夹(请确保此文件夹可读写)./3tx.x/ttt/ttt.php 3T模板类文件./3tx.x/ 程序文件(您写的程序都放在这里)2.您的PHP版本不能低于PHP4.0.6,我建议你的PHP版本升级至4.3.0以上,程序的整体性能将得到会大幅度提高3.运行时如出现变量未定义请在程序前加上"error_reporting(7);"函数三.语法模板简单语法说明:一般使用左边大括号"{"和右边大括号"}"作为模板语法的开始和结束,当然也可以使用自定义的分隔符,如使用"["和"]",以下说明以大括号为分隔符进行说明(注;下面的[tplCode]和[/tplCode]中间的代码才是模板语法代码)1.在模板文件中使用PHP代码,如:[tplCode]{php}$i = 3;echo $i;{/php}[/tplCode]请参考"example6"2.在模板中使用foreach循环,如:第一种用法(循环数组$a,相当于PHP中的foreach($a as $k=>$v)....)[/tplCode]{foreach:$a,$k,$v}$v = {$v}<br>{/foreach}[/tplCode]第二种用法(可以设定循环几次,假如数组$a有15个元素,则下面的循环则只取最前面5个) [tplCode]{foreach:$a,$k,$v,5}$v = {$v}<br>{/foreach}[/tplCode]第三种用法(可以设定循环几次,假如数组$a有15个元素,则下面的循环则从第3个元素开始,取到第5个元素结束)[tplCode]{foreach:$a,$k,$v,3,5}$v = {$v}<br>{/foreach}[/tplCode]请参考"example1"和"example3",在"foreach"循环中可以使用多维数组,具体请看"example10"3.在模板中使用IF语句,如:第一种用法[tplCode]{if:$a == "hello"}变量$a的值是"hello"{/if}[/tplCode]第二种用法[tplCode]{if:$a == true}变量$a为真{else}变量$a不为真{/if}[/tplCode]第三种用法[tplCode]{if:$a == 2}变量$a的值为2{elseif:$a == 3}变量$a的值为3{/if}[/tplCode]具体使用请参考"example2"及"example6"4.在模板中包含模板文件,如:{tplCode}{includetpl:head.tpl}{/tplCode}这里包含了模板文件"head.tpl",所包含的模板文件必须在同一个目录下5.在模板中包含PHP文件,如:{tplCode}{includephp:head.php}{/tplCode}这里包含了PHP文件"head.php",文件"head.php"在当前程序目录下包含文件请看""6.在模板中输出时间,如:{tplCode}{date:Y-m-d H:i:s}{/tplCode}后面的"Y-m-d H:i:s"字符串是标准的PHP时间标识,具体使用可以参考PHP手册具体使用请参考"example7"7.在模板中使用数学函数第一种用法,直接输出结果{tplCode}{math:3*2-5}{/tplCode}第二种用法,赋值给指定变量{tplCode}{math:3*2-5,$result}{/tplCode}第三种用法,赋值给指定变量,第三个参数设置是否立即输出,设为"Y"输出,"N"不输出{tplCode}{math:3*2-5,$result,Y}{/tplCode}具体使用请参考"example4"8.在模板中使用FOR循环如下代码所示[tplCode]{for:5,1000,1,$i}{$i}<br>{/for}{/tplCode}参数说明:5:表示从5开始循环1000:表示循环到1000结束1:表示每次循环的增量为1,相当于$n++$i:表示得到每次循环的值(上面的"5","1000","1"之类的常数也可用变量来代替,如:{for:$num,$max,$step,$i},其中的变量是在程序中用"assign()"方法赋值的)也参考如下代码(理解一下):[tplCode]{for:500,30,-2,$i}从500开始循环,每次减2,直到30才结束,当前循环的值是:<b>{$i}</b><br>{/for}{/tplCode}具体使用请参考"example2","example11"9.在模板中使用Email标签第一种用法:[tplCode]{email:redhat@}[/tplCode]第二种用法:[tplCode]{email:redhat@,Redhat的邮箱}[/tplCode]第三种用法:[tplCode]{email:redhat@,这是"Redhat"的邮箱<-dh->这个是带样式的<-dh->class=m,m}[/tplCode]具体使用请参考"example5"10.在模板中定义变量[tplCode]{assign:$tplVar,这是我定义的变量<-dh->可以在模板中输出也可用PHP代码输出}[/tplCode]具体使用请参考"example6".11.其它语法及功能尚在开发中......有好的意见或想法请去/2002/gbook.php提一下吧,发现BUG也请及时留言说明一下,谢谢!注:1.本模板支持多层嵌套的模板或PHP文件,支持多层foreach或for循环2.实际使用技巧在实际使用过程中如果把属性$cmpCheck设置为true则每次运行都会编译PHP程序,否则程序会根据编译后的PHP文件的存在时间长短判断是否要重新编译该属性默值即为true,一般在正在使用中才设为false(可加快速度)设置方法如:$tttObj->setCmpCheck(true);3.本程序最大的缺点就是不能准确的捕捉程序中出现的语法错误信息4.暂不支持缓存功能,如果你有好的想法不妨告诉我:-)5.由于采用的是混编模式编译模板为PHP文件,所以请不要输错了(当然模板是支持大小写一致的写法的,也就是说你写一个{math:38*7}和{MatH:38*7}的效果是一样的),如输入"{foreach:$data,k,$v}"编译将通过,但运行的时候会导致一个语法错误,因为里面的"k"前面少了一个"$"符号.本来已经写好了对每一行进行语法分析捕捉错误的代码,但发现代码达到几百行的时候占用时间比较长,如果代码比较少还可以,但如果较多的话会导致性能的下降.而且PHP本身就有很不错的出错信息提示,后来想想就没有去进行每行代码的分析了.6.不知大家是否注意到,在以上的标识中,参数都是不带引号或双引号的(条件判断语句除外),希望注意哦:-)四.使用1.建立PHP文件(命名为first.php,保存在当前目录下,即"./"),内容如下:<?phprequire_once "./ttt/ttt.php";//引入类文件$ttt = new TTT();//初始化3T模板类的实例$ttt->setTplDir("./tpl/");//需要编译的模板文件存放目录$ttt->setCmpDir("./cmp/");//编译后文件的存放目录$ttt->assign('title','天空的颜色');//设置变量$ttt->assign('content','蓝色,天气不错,万里无云,晴');//设置变量$ttt->assign('foot','欢迎欢迎');//设置变量$ttt->display('first.tpl');//输出?>2.建立tpl文件(命名为"first.tpl",保存在目录"./tpl/"下).内容如下:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><META http-equiv="Content-Type" content="text/html; charset=gb2312"><title>{$title}</title></head><body>{$content}<br><br>{$foot}</body></html>3.在浏览器浏览http://domain/path/to/3tvx.x/3t/first.php即可看到结果,当然你先要把PHP的运行环境配置好.4.更多例子请看程序自带的"example"系列...五.类属性(部分)$tplDir:String,"./tpl/"模板文件的目录,需要加载的模板就从此处加载$cmpDir:String,"./cmp/"编译后的PHP文件存放目录$cheDir:String,"./che/"$tplFile:String,""模板文件,所要解析的模板主文件$startLeft:String,"{"模板变量的左边界符号,可以自己通过setLeft(String $s)方法去设置$startRight:String,"}"模板变量的右边界符号,可以自己通过setRight(String $s)方法去设置六.类方法(部分)TTT(String|null)类构造器,可以在此直接设置需要解析的模板,如:$obj->TTT("head.tpl");setLeft(String)设置模板变量"$startLeft"的左边界,该变量默认为"{"setRight(String)设置模板变量"$startRight"的左边界,该变量默认为"{"setTplDir(String)设置模板的存放路径,此方法的同名方法是"setTemplatesFile()"setCmpDir(String)设置模板编译后的存放路径,此方法的同名方法是"setCompilesFile()"setCheFile(String)设置缓存的模板文件目录,此方法的同名方法是"setCachesFile()"setCacheFilter(String|array)当使用了模板的缓存功能时,使用此方法设置的文件将不被缓存处理setWordsFilter(array)设置不宜在网站上显示的字符或字符串,如:$ttt->setWordsFilter('abc','xyz');,把网页中的所有"abc"替换成"xyz";setWordsFile(String|array)当设置了不宜在网站上显示的字符或字符串时,用此方法设置的文件中的字符或字符串将会不受"setWordsFilter()"方法影响而直接显示setQuery(String)此方法只在使用了模板的缓存功能时才使用,主要是用来设置唯一的一串字符以使缓存文件不会重复,如果没有设置的话模板也会自动获取但会使程序变的不安全,只要不断的向程序GET不同的参数变会一直生成不同的缓存文件,N时间后,我想你服务器的硬盘就没空间了,当然这些只有在你使用了缓存功能并没有使用此方法设置唯一字符串所造成的,所以正确设置并在程序中处理一些GET或POST的值就显的很重要。

基于MVC模式的PHP框架设计

基于MVC模式的PHP框架设计

基于MVC模式的PHP框架设计【摘要】对于任何语言,框架的发展都是为了降低程序之间的依赖性和耦合性,使重用性达到最高。

本文参照框架、PHP、MVC模型的优缺点,设计一个部署和应用简单、且效率高,具有良好的扩展性和可维护性、占用服务器资源低的PHP框架。

【关键词】框架;MVC模式;PHP本文设计的PHP框架(下文统称为IdeaPHP),是一个采用面向对象的设计思想,基于MVC模式开发的轻量级PHP框架,具有单一入口、类自动加载、强大基础类、扩展类等功能。

该框架继承PHP的优点,部署和应用极为简单、且效率高,具有良好的扩展性和可维护性、占用服务器资源低等特点,能使WEB 开发变得更简单、更快捷,可以稳定的用于个人或中小型企业系统的开发。

1 框架特点1)基于MVC的开发模式,三个部件相互独立,改变其中一个不会影响其它两个,低耦合性;同时,具有很好的维护性、重用性和适用性。

2)本框架采用模块和操作的方式设计,代码采用面向对象思想,框架源码简单易用,独立灵活,便于维护和调试,或二次开发。

3)该框架提供了数据库访问层、功能扩展接口(支持自定义扩展类库和扩展函数),直接使用即可完成一些常见的功能,操作灵活,简单易用。

4)使用Memcached对SQL和session进行缓存,使用Smarty缓存技术进行页面静态化,提升效率,减少运行消耗。

2 框架主要功能2.1 单一入口单一入口即一个文件处理所有的HTTP请求,即访问网站任何功能,都是从浏览器访问index.php文件,这个文件就是这个应用程序的单一入口。

在一般的web过程化编程时,每个PHP文件都能独立访问并运行,这犹如一场演唱会,需要在每个入口都要检票和安全检查。

而采用单一入口进行项目部署和访问时,一个项目只有一个(但不一定是唯一)入口,就像演唱会如果只能从一个入口入场(程序是抽象的,一个和多个入口效率一样),则可以灵活控制现场秩序和安全。

这在一些常见框架如zend,thinkphp,qeephp等,都采用了统一的入口,这样的设计模式在权限控制,url重写,结合MVC清晰的目录结构等都有很大优势。

基于PHP的MVC框架核心技术研究与实现

基于PHP的MVC框架核心技术研究与实现
图 2所 示 。
对 于提高 P H P在 企 业 级应 用 软 件 开 发 中 的 规 范 性 、 可 靠 性 与 可 扩 展 性 都 有 较 大 的促 进 作 用 。
2 MV C实际模 型
MV C( Mo d e l 、V i e w、C o n t r o l l e r ) 是 指 现 代 程 序 设 计 中 一 种 分 层 设 计 模 式 ,将 程 序 代 码 按 其 功 能 边 界 分 为 模 型 ,视 图
S 0 F r W A R E D E V E பைடு நூலகம் 0 P M E N T A N D D E S I G N
软件 开发 与设计
基于 P H P的 MV C框 架核 心技术研 究与实现
罗维
( 成都中医药大学医学信 息工程学 院,成都 6 1 0 0 8 3 )
摘 要 :M V C应用程序开发框架是 MV C开发模 式实现 的基础 。通过对 MV C模 式的深入研 究,以 P H P为基 础 ,提 出了 MV C的 实际模 型 ,设计 了 M V C框 架的体 系架构 ,解决 了框 架的路 由模式 ,研制 了控 制器工厂 、D A O组件与
Ab s t r a c t : MVC a p p l i c a t i o n r f a me wo r k i S f u n d a me n t a l f o r t l l e r e li a z a t i o n MVC d e s i g n p a t t e r n . By t h e t h o r o u g h s t u d y o f t h e t h e o r y o f MVC ,t h i s p a p e r p r o p o s e d a p r a c t i c a l MVC mo d e l b a s e o n P HP l a n g u a g e . T h e a r c h i t e c t u r e o f MVC f r a me w o r k w a s d e s i g n e d .T he ou r t i n g mo d e o f f r a me wo r k w a s r e s o l v e d .T he c o n t r o l l e r f a c t o y ,DAO r c o mp o n e n t a n d t e mp l a t e e n g i n e we r e d e v e l o p e d . F i n a l l y a c o mp l e t e MVC f r a me w o r k d e v e l o p me n t me t h o d wa s f o r me d a s w e l l a s p r o v i d e d s u p p o r t i n g s y s t e m f o r e n t e r p i r s e a p p i f c a t i o n s y s t e m. Ke y wo r d s : MVC mo d e; MVC f r a me wo r k; Ro u t e mo d e; DAO C o mp o n e n t; T e mp l a t e e n g i n e

PHP开发一个属于自己MVC框架

PHP开发一个属于自己MVC框架

PHP开发一个属于自己MVC框架一、起名:先给我们的PHP-MVC框架起个名字,叫宇宙无敌框架UniverseInvincibleFrameWork二、实现功能1、MVC分层2、唯一入口3、关键常量可配置4、自动载入函数5、路由分发6、数据库工厂7、多数据支持8、多项目支持三、详细分解如何PHP-MVC框架1、MVC分层1)、目录结构2)、目录简介(1)、Home、Admin是项目名,可以无限扩展(2)、Config是配置文件所在目录,UniverseInvincibleFrameWork是框架核心文件所在目录(3)、Index.php是唯一入口文件(4)、Home目录下就是标准的Controller、Model、View,另外新增了Service(5)、UniverseInvincibleFrameWork目录下是核心框架入口类、自动载入类、路由类已经数据库文件所在的DB目录(6)、DB目录是数据库相关操作。

比如数据库工厂类,接口规范类,CURD操作等。

2、唯一入口1)、采用单一入口模式进行项目部署和访问,无论完成什么功能,一个项目都有一个统一的入口。

2)、只需要引入框架核心文件App.php,然后执行该类的方法<?php/*** 宇宙无敌框架UniverseInvincibleFrameWork* 唯一入口* Created by lixuan-it@* User: lane* Date: 15/8/27* Time: 下午3:17* E-mail: lixuan868686@* WebSite: *///引入框架核心文件require_once 'UniverseInvincibleFrameWork/App.php'; //初始化框架$obj = new UniverseInvincibleFrameWork\App(); $obj->init();3)、框架核心文件源码:<?phpnamespace UniverseInvincibleFrameWork;class App{public function init(){//设置头- utf-8$this->_setHeader();//载入系统配置文件$this->_loadSysFile();//自动载入函数$this->_setAutoload();//设置路由$this->_setRoute();}/*** 载入系统配置文件*/private function _loadSysFile(){require_once dirname(__FILE__).'/Function.php';//1、require_once dirname(__FILE__).'/../config/config.php';//2、$GLOBALS['config'] =config.php的所有内容$GLOBALS['config'] = require_once dirname(__FILE__).'/../config/config.php'; }/*** 头*/private function _setHeader(){header('Content-type: text/html; charset=UTF-8');}/*** 自动载入函数*/private function _setAutoload(){//自动载入函数require_once dirname(__FILE__).'/../UniverseInvincibleFrameWork/Autoload.php';$autoload = new Autoload();$autoload->register();}/*** 设置路由*/private function _setRoute(){$routeObj = new Route();$routeObj->parse();}}3、关键常量可配置1)、谁也不会傻呼呼的到把数据库链接信息等配置信息写死到代码里,那么就必须有一个配置文件。

php mvc架构例子 -回复

php mvc架构例子 -回复

php mvc架构例子-回复PHP MVC架构例子PHP MVC(模型-视图-控制器)架构是一种广泛应用于Web应用程序开发的设计模式。

它将应用程序的不同组件分离并降低了耦合性,使代码更易于理解、维护和扩展。

本文将介绍一个具体的PHP MVC架构的例子,并逐步回答相关问题。

1. 什么是PHP MVC架构?PHP MVC架构是一种软件设计模式,它将应用程序分为三个主要组件:模型、视图和控制器。

模型负责处理与数据相关的任务,例如数据库交互和数据处理。

视图负责显示数据和用户界面。

控制器充当中介,处理用户交互,并协调模型和视图之间的通信。

2. 如何创建一个PHP MVC应用程序?首先,我们需要创建一个目录结构来组织我们的应用程序。

常见的目录结构如下:- app- controllers- models- views- public- css- js- vendor- index.php3. 如何创建一个控制器?在controllers目录下创建一个新的PHP文件,例如HomeController.php。

在该文件中,我们需要定义一个HomeController 类,继承自基类Controller。

在HomeController类中,我们可以定义各种操作,例如显示首页或处理表单提交。

4. 如何创建一个模型?在models目录下创建一个新的PHP文件,例如UserModel.php。

在该文件中,我们需要定义一个UserModel类,继承自基类Model。

在UserModel类中,我们可以定义与用户相关的方法,例如获取用户信息、添加用户等。

5. 如何创建一个视图?在views目录下创建一个新的PHP文件,例如home.php。

在该文件中,我们可以使用HTML和PHP代码来定义页面的布局和样式,并使用PHP代码获取和展示数据。

6. 如何协调控制器和模型之间的通信?在控制器中,我们可以实例化相应的模型,并调用模型中定义的方法来获取数据。

教程:使用PHP开发自己的MVC框架

教程:使用PHP开发自己的MVC框架

教程:使用PHP开发自己的MVC框架教程:使用PHP开发自己的MVC框架一、什么是MVCMVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

除此之外,此模式通过对复杂度的简化,使程序结构更加直观。

软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。

专业人员可以通过自身的专长分组:?(控制器Controller)- 负责转发请求,对请求进行处理。

?(视图View)–界面设计人员进行图形界面设计。

?(模型Model)–程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

模型(Model)“数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。

“模型”有对数据直接访问的权力,例如对数据库的访问。

“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。

但是模型中数据的变化一般会通过一种刷新机制被公布。

为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。

视图(View)视图层能够实现数据有目的的显示(理论上,这不是必需的)。

在视图中一般没有程序上的逻辑。

为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。

控制器(Controller)控制器起到不同层面间的组织作用,用于控制应用程序的流程。

它处理事件并作出响应。

“事件”包括用户的行为和数据模型上的改变。

二、为什么要自己开发MVC框架网络上有大量优秀的MVC框架可供使用,本教程并不是为了开发一个全面的、终极的MVC 框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,你将学习面向对象编程和设计模式,并学习到开放中的一些注意事项。

php实现最简单的MVC框架实例教程

php实现最简单的MVC框架实例教程

首先,在学习一个框架之前,基本上我们都需要知道什么是mvc,即model-view-control,说白了就是数据控制以及页面的分离实现,mvc就是这样应运而生的,mvc分为了三个层次,而且三个层次各司其职,互不干扰,首先简单介绍下,各个层次:view即是视图,也就是web页面,control即是控制器向系统发出指令的工具,model 简单说是从数据库中取出数据进行处理。

MVC的工作流程如下:1. 浏览者-&gt;调用控制器,对此发出指令2. 控制器-&gt;按指令选取一个合适的模型3. 模型-&gt;按照控制器指令选取相应的数据4. 控制器-&gt;按指令选取相应的视图5. 视图-&gt;把第三步取到的数据按用户想要的样子显示出来简单地实例开发如下,首先进行第一个控制器的开发我们在此命名规范如下testController.class.php1&lt;?php2class testController{3function show(){45}6}7?&gt;其次书写一个简单地模型如下testModel.class.php1&lt;?php23class testModel{4function get(){5return "hello world";67}8}9?&gt;第一个视图文件的创建testView.class.php 是为了呈现数据所存在的1&lt;?php2class testVies{3 function display($data){4 echo $data;56 }7 }8?&gt;下面我们要做的就是按照之前所说的五步进行程序的测试:代码如下测试文件的建立test.php1&lt;?php2require_once('testController.class.php');3require_once('testModel.class.php');4require_once('testView.class.php');5$testController = new testController();//调用控制器6$testController-&gt;show();7?&gt;01&lt;?php02class testController{03 function show(){04 $testModel = new testModel();//选取合适的模型05 $data = $testModel-&gt;get();//获取相应的数据06 $testView = new testView();//选择相应的视图07 $testView-&gt;display($data);//展示给用户08 }09}10?&gt;而后我们浏览器打开test.php 会显示为hello world,说明我们已经成功了。

php自制框架 讲义

php自制框架 讲义

PHP自制框架讲义一、概述在PHP开发中,使用框架可以大大提高开发效率和代码质量。

然而,有时候我们可能没有现成的框架可用,或者我们需要一个符合特定需求的框架。

这时,我们可以考虑自己制作一个PHP框架。

二、框架结构一个基本的PHP框架通常包含以下几个部分:1. 路由:用于处理URL路由,将不同的URL映射到相应的控制器和方法。

2. 控制器:用于处理业务逻辑和数据操作。

3. 模型:用于与数据库进行交互。

4. 视图:用于呈现用户界面。

5. 配置:用于存储框架的配置信息。

三、制作框架步骤下面是一个简单的PHP框架制作步骤:1. 确定框架名称和文件结构首先,你需要为你的框架选择一个合适的名称,并设计文件结构。

通常,你可以将框架文件放在一个公共目录下,例如/public。

文件结构可以如下:markdown/public/index.php/app/controllers/models/views/config2. 路由设置在index.php文件中,你需要定义路由规则。

可以使用简单的数组来定义路由,例如:php$routes = ['/' => 'App\Controllers\HomeController@index','/about' => 'App\Controllers\AboutController@index',];然后,你可以使用一个简单的函数来根据URL匹配相应的控制器和方法:phpfunction route($url) {global $routes;$controller = $routes[$url];list($class, $method) = explode('@', $controller);$controller = new $class();return call_user_func([$controller, $method]);}3. 控制器和模型在controllers目录下创建控制器类,例如HomeController和AboutController。

写一个属于自己的MVC框架

写一个属于自己的MVC框架

小恺教你写一个属于自己的MVC框架-更新完毕管理提醒: 本帖被deepblue 设置为精华(2009-09-07)在开始之前需要同学们知道的知识1.php基础知识2.单一入口, 不知道的可以看看这里(/html/webkaifa/PHP/PHP/2009/0819/3199. html)具备以上两点, 那我们就可以开始啦. 哈哈!先来说一下程序的执行流程首先有个入口文件, 然后初始化一些程序, 之后根据请求调用不同的类和方法首先我们弄一个入口文件Index.php 来看看代码复制代码1.2.<?php3.require "Init.php";4.$control = new Controller();5.$control->Run();6.?>代码没什么特别的, 首先先引入Init.php文件然后实例化一个类然后调用该类的Run()方法这里我们把这个类叫做控制器既然引入了Init.php文件, 那么我们继续看看Init.php文件的源码复制代码1.2.<?php3.header("Content-type:text/html;charset=utf-8");4.!defined('ROOT_PATH') && define('ROOT_PATH', str_replace('\\', '/', dirname(__FILE__)));5.require ROOT_PATH . '/Core/Config.php'; //引入配置文件6.require ROOT_PATH . '/Core/Controller.class.php'; //引入控制器类文件7.require ROOT_PATH . '/Core/View.class.php'; //视图类文件8.require ROOT_PATH . '/Core/Model.class.php'; //模型类文件9.?>分析一下代码, 如果你懂了, 可以略过这一步, 继续往下看哦.首先设置字符集, 然后判断如果没有定义常量"ROOT_PATH"那么就定义它然后就是引入一些文件, 首先是配置文件, 控制器类文件, 视图类文件, 模型类文件同理既然引入了文件,那么我们就打开文件看看代码, 先来看Config.php文件复制代码1.2.<?php3.$C = array(4.'URL_MODE' => 1, //URL模式, 1普通模式, 2 PATH_INFO模式5.'DEFAULT_CONTROL' => 'welcome', //默认调用的控制器6.'DEFAULT_ACTION' => 'index', //默认执行的方法7.);8.?>没什么特别的就是一个数组, 有三个值, 暂时先这样, 以后有需要在来增加那么好, 我们继续看Controll.class.php复制代码1.2.<?php3.class Controller4.{5.public function Run()6.{7.$this->Analysis(); //开始解析URL获得请求的控制器和方法8.$control = $_GET['c'];9.$action = $_GET['a'];10.//这里构造出控制器文件的路径11.$controlFile = ROOT_PATH . '/Controllers/' . $control . '.class.php';12.if(!file_exists($controlFile)) //如果文件不存在提示错误, 否则引入13.{14.exit('控制器不存在' . $controlFile);15.}16.include($controlFile);17.$class = ucwords($control); //将控制器名称中的每个单词首字母大写,来当作控制器的类名18.if(!class_exists($class)) //判断类是否存在, 如果不存在提示错误19.{20.exit('为定义的控制器类' . $class);21.}22.$instance = new $class(); //否则创建实例23.if(!method_exists($instance, $action)) //判断实例$instance中是否存在$action方法, 不存在则提示错误24.{25.exit('不存在的方法' . $action);26.}27.$instance->$action();28.}29./**30.* 解析URL获得控制器与方法31.*32.* @access protected33.* @return void34.*/35.protected function Analysis()36.{37.global $C; //包含全局配置数组, 这个数组是在Config.ph文件中定义的38.if($C['URL_MODE'] == 1) //如果URL模式为1 那么就在GET中获取控制器, 也就是说url地址是这种的[url=http://localhost/index.php?c]http://localhost/inde x.php?c[/url]=控制器&a=方法39.{40.$control = !empty($_GET['c']) ? trim($_GET['c']) : '';41.$action = !empty($_GET['a']) ? trim($_GET['a']) : '';42.}43.else if($C['URL_MODE'] == 2) //如果为2 那么就是使用PATH_INFO模式,也就是url地址是这样的[url=http://localhost/index.php/]http://localhost/index.php/ [/url]控制器/方法/其他参数44.{45.if(isset($_SERVER['PATH_INFO']))46.{47.//$_SERVER['PATH_INFO']URL地址中文件名后的路径信息, 不好理解, 来看看例子48.//比如你现在的URL是[url=/index.php]http://www.ph/index.php[/url] 那么你的$_SERVER['PATH_INFO']就是空的49.//但是如果URL是[url=/index.php/abc/123]http://ww/index.php/abc/123[/url]50.//现在的$_SERVER['PATH_INFO']的值将会是index.php文件名称后的内容/abc/123/51.$path = trim($_SERVER['PATH_INFO'], '/');52.$paths = explode('/', $path);53.$control = array_shift($paths);54.$action = array_shift($paths);55.}56.}57.//这里判断控制器的值是否为空, 如果是空的使用默认的58.$_GET['c'] = $control = !empty($control) ? $control : $C['DEFAULT_CONTROL'];59.//和上面一样60.$_GET['a'] = $action = !empty($action) ? $action : $C['DEFAULT_ACTION'];61.}62.}63.?>注释写的很清楚, 这里我就不多说了, 做到这, 你就可以建立一个Controller目录, 然后在目录中建立welc ome.class.php文件写入如下内容复制代码1.2.<?php3.class Welcome4.{5.public function index()6.{7.echo 'Hello';8.}9.}10.?>允许程序你将会看到Hello然后在写一个方法复制代码1.2.<?php3.class Welcome4.{5.public function index()6.{7.echo 'Hello';8.}9.10.public function show()11.{12.echo '方法名称Show';13.}14.}15.?>再次运行程序, 将url地址改为http://你的域名/index.php/welcome/show/你会看到'方法名称Show'好了, 看到这里我们的控制器其实已经弄得差不多了今天先弄到这里明天我们继续View.class.php 视图类文件, 和在welcome.class.php控制器中调用视图程序源码, 回复后下载吧!小恺教你写一个属于自己的MVC框架之View层上集说到控制器, 现在我来看看视图基类复制代码1.2.<?php3.class View4.{5. protected $vars = array();6. protected function assign()7. {8. }9. protected function display()10. {11. }12.}13.?>是不是很熟悉这两个方法, 呵呵, 用来给模板设置变量和显示模板的. 和smarty一样, $vars属性是用来保持模板变量的数组, 我来写完它.先看看assign方法复制代码1.2.<?php3. public function assign($var, $value)4. {5. if(is_array($var))6. {7. $this->vars = array_merge($this->vars, $var);8. }9. else10. {11. $this->vars[$var] = $vaule;12. }13. }14.?>很简单, 首先有两个参数$var模板变量名称, $value对应的值先判断$var是否是数组, 如果是那么将他于属性$vars合并将$var当作下标$value当作值, 添加到属性$vars中在来看display方法复制代码1.2.<?php3. public function display($file)4. {5. include(ROOT_PATH . '/Core/Template.class.php');6. $this->template = Template::GetInstance();7. $this->template->templatePath = ROOT_PATH . '/Views/';8. $this->template->cache = TRUE;9. $this->template->cachePath = ROOT_PATH . '/Cache/';10. $this->template->cacheLifeTime = 1;11. $this->template->templateSuffix = '.html';12. $this->template->leftTag = '{';13. $this->template->rightTag = '}';14. $templateFile = ROOT_PATH . '/Views/' . $file . '.html';15. if(!file_exists($templateFile))16. {17. exit('模板文件' . $file . '不存在');18. }19. $this->template->display($file, $this->vars);20. }21.?>这个看上去有点多, 不着急我们慢慢解释首先有一个参数$file 模板文件名称, 不包括路径以及后缀然后引入模板类, 设置模板的参数先设置模板文件目录, 然后是否开启缓存, 然后缓存目录, 缓存有效时间, 模板文件后缀, 左右定界符然后组合出模板文件路径比如你传入的$file值是index 那么就是对应的模板文件就是模板目录/index.ht ml然后判断模板文件是否存在, 不存在则提示错误然后在调用模板类实例的display方法将模板文件名称, 和模板变量传入这里这个模板类我就不多说了, 如果有兴趣的朋友可以下载附件查看, 类中有详细注视这里既然设置了两个目录, 那么我们就去创建它, 在程序根目录下建立Views 和Cache 两个目录, 后面会用到现在我们打开昨天写好的Controller.class.php 控制器类在里面加入一个属性和几个方法复制代码1.2.<?php3. protected $view = NULL;4. public function __construct()5. {6. //实例化上面写到的视图类7. $this->view = new View();8. }9.10. public function assign($var, $value = '')11. {12. $this->view->assign($var, $value);13. }14. public function display($file)15. {16. $this->view->display($file);17. }18.?>现在进入到Views目录中建立一个模板命名为index.html 内容如下复制代码1.2.<html>3.<head>4. <title>{$title}</title>5.</head>6.<body>7.{$body}8.</body>9.</html>控制器类中也有assign方法, 他是调用构造函数中创建的view类实例的assign方法也就是我们上面定义的那个dispaly方法也一样现在我们打开welcome.class.php文件, 修改index方法, 注意这里好要将Welcome类继承自Controller类复制代码1.2.<?php3.class Welcome extends Controller4.{5.public function index()6.{7. $this->assign('title', 'Hello World');8. $this->assign('body', '小恺教你写一个属于自己的MVC框架');9. $this->display('index');10.}11.}12.?>现在你需要做的就是打开浏览器, 在地址栏中输入http://yourdomain/Index.php然后你将会看到"小恺教你写一个属于自己的MVC框架"如果出现了这行字, 那么恭喜你View层也搞定了, 明天我们继续小恺教你写一个属于自己的MVC框架之模型如果你没看懂这篇文章也可以联系QQ 601200376 Email [url=mailto:myxiaokai@]myxiaokai @[/url]最后希望大家多多支持... 哈哈广告一下Tomorrow Framework 0.1测试版以经快完工了, 想看看的朋友可以联系我, "源文件有详细注视哦!!!"程序源码, 回复后下载吧...好几天没上啦, 实在对不住大家..接着上集,今天我们来说模型的实现.在Core目录中建立Model.class.php 文件, 然后建立一个Model类复制代码1.<?php2.class Model3.{4.//数据库连接句柄5.protected $dbLink = NULL;6.}7.?>现在来给他添加方法复制代码1.<?php2./**3. * 构造器, 连接数据库4. *5. * @access public6. * @return void7. */8.public function __construct()9.{10. global $C;11. $this->dbLink = mysql_connect($C['DB_HOST'], $C['DB_USER'], $C['DB_PWD']) or exit(mysql_error());12. mysql_select_db($C['DB_NAME'], $this->dbLink) or exit(mysql_error());13. mysql_query("SET NAMES {$C['DB_CHAR']}");14.}15./**16. * 执行SQl命令17. *18. * @access public19. * @param string $sql20. * @return resource21. */22.public function Query($sql)23.{24. $res = mysql_query($sql) or exit(mysql_error());25. return $res;26.}27./**28. * 执行SQl命令,返回是否执行成功29. *30. * @access public31. * @param string $sql32. * @return bool33. */34.public function Execute($sql)35.{36. if(mysql_query($sql))37. {38.return TRUE;39. }40. return FALSE;41.}42./**43. * 返回处理后的结果集44. *45. * @access public46. * @param resource $res 结果集47. * @return mixed48. */49.public function Fetch($res, $type = 'array')50.{51. $func = $type == 'array' ? 'mysql_fetch_array' : 'mysql_fetch_object';52. $row = $func($res);53. return $row;54.}55.?>这几个方法很简单, 就是一般的mysql操作. 不过多解释现在打开Config.php把内容改为复制代码1.<?php2.$C = array(3.'URL_MODE' => 2, //URL模式, 1普通模式, 2 PATH_INFO模式4.'DEFAULT_CONTROL' => 'welcome', //默认调用的控制器5.'DEFAULT_ACTION' => 'index', //默认执行的方法6.'DB_HOST' => 'localhost', //mysql主机7.'DB_USER' => 'root', //mysql用户8.'DB_PWD' => '', //mysql密码9.'DB_CHAR' => 'utf8', //字符集10.'DB_NAME' => 'test', //使用的数据库11.);12.?>然后在打开Controller.class.php 控制器基类在里面加一个方法, 用来加载模型复制代码1.<?php2.protected function LoadModel($modelName)3.{4. $modelFile = ROOT_PATH . '/Models/' . $modelName . '.class.php'; //构造模型文件路径5. !file_exists($modelFile) && exit('模型' . $modelName . '不存在'); //如果模型文件不存在提示错误6. include($modelFile); //存在, 则引入7. $class = ucwords($modelName); //获得模型类名8. !class_exists($class) && exit('模型' . $modelName . '未定义');; //判断是否定义了模型类, 如果没有提示错误9. $model = new $class(); //实例化模型类10. return $model; //返回实例11.}12.?>注释很详细也不做解释了. 现在在根目录下家里Models目录, 然后建立一个test.class.php文件内容很简单, 继承自Model类就行了复制代码1.<?php2.class Test extends Model3.{4.}5.?>然后在自定义的控制器welcome.class.php中修改index方法复制代码1.<?php2.public function index()3.{4. $model = $this->LoadModel('test'); //载入模型5. $res = $model->Query("SELECT * FROM reg"); //查询表, 这里查询你有的表就行了6. $row = $model->fetch($res); //处理结果集返回数组7. print_r($row); //打印出来8.}9.?>这样模型也搞定了, 这里只是是抛砖引玉, 不对的地方希望大家指出.知道大概后你可以自己扩展, 比如做出多语言, 数据库抽象层, 等等等... 完整目录结构├─Core├─Controllers├─Views├─Cache└─Models带文件的目录结构│Description.php│Index.php│Init.php│Desription2.php│Desription3.php│├─Core│Config.php│Controller.class.php│View.class.php│Template.class.php│Model.class.php│├─Controllers│welcome.class.php│├─Views│index.html│├─Cache│6a992d5529f459a44fee58c733255e86.php│└─Modelstest.class.php。

PHP培训教程教你快速打造PHP MVC框架

PHP培训教程教你快速打造PHP MVC框架

PHP培训教程教你快速打造PHP MVC框架兄弟连IT教育自2006年成立以来,至今已有11年教育经验,现已开设有PHP培训,Linux培训,Java培训、JavaEE+大数据培训、UI培训、机器人培训等课程。

MVC框架在现在的开发中相当流行,不论你使用的是JAVA,C#,PHP或者IOS,你肯定都会选择一款框架。

虽然不能保证100%的开发语言都会使用框架,但是在PHP社区当中拥有最多数量的MVC框架。

今天你或许还在使用Zend,明天你换了另一个项目也许就会转投Yii,Laravel或者CakePHP的怀抱。

如果你刚开始使用一种框架,当你看它的源码的时候你会觉得一头雾水,是的,这些框架都很复杂。

因为这些流行的框架并不是短时间之内就写出来就发行的,它们都是经过一遍又一遍的编写和测试加上不断的更新函数库才有了今天得模样。

所以兄弟连PHP培训认为,了解MVC框架的设计核心理念是很有必要的,不然你就会感觉在每一次使用一个新的框架的时候一遍又一遍的从头学习。

所以最好的理解MVC的方法就是写一个你自己的MVC框架。

在这篇文章中,小编将会向你展示如何构建一个自己的MVC框架。

MVC架构模式M:Model-模型V:View-视图C:Controller-控制器MVC的关键概念就是从视图层分发业务逻辑。

首先解释以下HTTP的请求和相应是如何工作的。

例如,我们有一个商城网站,然后我们想要添加一个商品,那么最简单的一个URL就会是像下面这个样子:/index.php?p=admin&c=goods&a=add 就是主域名或者基础URL;p=admin意味着处在管理模块,,或者是系统的后台模块。

同时我们肯定也拥有前台模块,前台模块供所有用户访问(本例中,它是p=public)c=goods&a=add意思是URL请求的是goods控制器里的add方法。

前台控制器设计在上面的例子中index.php中是什么?在PHP框架中它被称为入口文件。

基于MVC模式的PHP程序开发

基于MVC模式的PHP程序开发

基于MVC模式的PHP程序开发【摘要】随着互联网以及电子商务的不断发展,动态网站建设的要求也越来越高,传统的网站开发方式已经不能满足日益发展的业务要求,MVC模式的产生很好的解决了这个问题。

MVC就是一个专门针对解决大型Web项目的开发模式。

PHP作为一种专业的网站开发语言,尤其是新版本的PHP5能够和MVC 模式很好的结合,两者的有效结合能够开发出大规模的复杂的网站。

本文主要介绍PHP语言的特点,以及MVC模式开发的内容,并对国内外流行的MVC模式进行介绍。

【关键词】PHP;Smarty;MVC1 PHP语言的简介PHP,是英文超文本预处理语言Hypertext Preprocessor的缩写。

PHP 是一种HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛地运用。

PHP语言有以下特点:1)支持的数据库非常广泛,SQL Server,Oracle,MySQL,DB2,Access 等。

在实际应用中,跟PHP搭配最合适的还当属MySQL。

2)跨平台性非常好,支持Windows系列操作系统,LINUX操作系统和UNIX 操作系统。

通常最顶点的应用时在LINUX操作系统中。

3)支持多种Web服务器。

微软的IIS,Apache等,通常应用Apache服务器。

4)免费开源软件。

同时与Linux、Apache、MySQL构成性价比最高的Web 系统,即我们通常所说的LAMP系统开发方式。

5)PHP5.0有成熟的面向对象体系,能够适应基本的面向对象要求,完全可以用来开发大型商业程序。

2 Smarty模板技术尽管PHP功能很强大,但是由于PHP是属于一种HTML内嵌式语言,在开发过程中,很多程序员将HTML代码与PHP代码混合写在同一页面,PHP体现的还是面向过程的方式。

为了真正实现PHP面向对象的功能,我们可以利用模板技术,将HTML代码与PHP后台程序相分离。

php简单实现MVC

php简单实现MVC

php简单实现MVC在PHP中使⽤MVC越来越流⾏了,特别是在⼀些开源的框架当中。

MVC⾜以应对⼤多数的情况,但还有⼀些情况是其不太适合的,如⽐较简单的个⼈博客,对于只有⼏百篇⽂章量级的博客,使⽤MVC让⼈觉得有些太复杂了;同样对于新浪等门户⽹站,使⽤MVC,将有⼤量的⽂件被加载,对于速度的影响是⽆法接受的。

枫⽵梦介绍MVC的基本原理及⼀种简单的实现。

如下介绍内容适⽤PHP开发。

PHP中的MVCMVC[1]在软件⼯程中是⼀种软件的架构。

从php的⾓度来讲MVC有⼀些不同。

Model(模型),程序应⽤功能的实现,程序的逻辑的实现。

在PHP中负责数据管理,数据⽣成。

View(视图),图形界⾯逻辑。

在PHP中负责输出,处理如何调⽤模板、需要的资源⽂件。

Controller(控制器),负责转发请求,对请求处理。

在PHP中根据请求决定调⽤的视图及使⽤的数据。

为什么使⽤MVCMVC的主要作⽤是为了将代码分层、分类。

MVC的主要⽬的是为了解决Web开发中分离开发与设计⼯作,使其⼯作相对独⽴。

在这样的过程中还发现了其他的⼀些优点,⽹站的⽬录结构更加清晰,⽹站更易维护与扩展,可以实现模块的复⽤。

MVC实现请求URL⾸先,约定请求页⾯时的URL,以如下结构进⾏实现:复制代码代码如下:localhost/index.php?c=demo&a=index¶m=welcome如果想得到更加优美的URL结构,可以进⾏优化,为由这URL结构优化与本⽂关系不⼤,以后进⾏分享。

从上⾯的参数可以看出,访问的⽂件是index.php,同时含有3个参数分别为c、a、param。

MVC⽬录结构接着,规划MVC的⽬录结构如下:复制代码代码如下:/*├─www # ⽹站根⽬录│├─controller # 控制器⽬录││├─democontroller.php # demo控制器│├─model # 模型⽬录││├─model.php # model模型│├─view # 视图⽬录││├─index.php # index视图│├─index.php # ⼊⼝⽂件*/控制器controller将如下代码添加到controller/democontroller.php⽂件中。

基于MVC模式的PHP框架设计

基于MVC模式的PHP框架设计
科技・ 探索・ 争鸣
S c 科 i e n c e & 技 T e c h 视 n o l o g y 界 V i s i o n
T r 论 ; 坛
3 . 1 控制器 的声 明( e o n t r o l l e r ) 3 . 2 . 1 I d e a P H P中表操作接 口的特性 开发程序的核心业务是 需要对数据库频 繁执行 S Q L ( 增、 删、 改、 控制器接受用户 的输入并调用模 型和视 图去完成用户 的需求 . 所 以当 We b 发送请求时时 .控制器接收请求并决定调用 哪个模 型去处 查) 语 句操作 , 该操作也加重了服务器 负担 , 降低 网站性能 ; 同时, 现有 Q L注入。本框架在 M o d e l 模块 中提供 理. 然后再确定用哪个视 图来显示返 回的数据Ⅲ 。 I d e a P H P 在使用控制 黑客攻击网站的主流方式为 S 器时 . 系统会 自动寻找项 目应用 c o n t r o l s目录下相关的类。如 , 某个应 了统一数据库操作接 口. 不仅可 以省去编写 S Q L语句的烦恼 . 也不用 用程序有 图片管理( i ma g e ) 、 留言管 ̄( m e s s a g e ) 、 用户管理 ( u s e r ] 三 个模 考虑 S Q L 语句的执行效率和 S Q L优化以及 S Q L注入等安全问题。 块, 则对应需要三个控 制器 I m a g e类、 Me s s a g e类和 U s e r 类。模块的调 I d e a P H P 框架 中使用 D 0 内置函数 实例化 M o d e l 类, 且所有 的 S Q L 以最简单 的方式完成对表 的操作 。为 度和执行通过前 文的 UR L访 问方式完成 . 如h t t p : / / w w w . I d e a P HP . c o n r / 查询都可以采用连贯操作方式 . i n d e x . p h p / i ma g e / o p e n / p i d / 1 / p a g e / 2这个 U R L地 址 中 .用 户访 问 的是 防止 S Q L的注入 .每个 S Q L 语句都使用 M y S Q L或 P D O中的预处理 i m ge a 模块 . 就需要为这个模块定义一个控制器 I m ge a 类才能被调 度 . 方式 。 确保参数 绑定 的任何“ 值” 不会在 s Q L 语句 中编译 。 同时内置的 抽象数据库访 问层 . 把不 同的数据库操作封装起 来 , 建立统一 的操作 该类保存在应用程序 c o n t r o l s 目录中的 i m a g e . c l a s s . p h p 文件。 接 口. 无需针对不 同的数据表写 重复的代码 . 这在 重用性 、 扩展性 、 可 维护性都有很好保 障 - 定义在 c o n r o 1 5 目录下 ,文件名为 l m口 e c l a s s 帅 3 . 2 . 2 自定义 M0 d e l 类 / 除 了前文 中的内置 M o d e l 类. I d e a P H P框架中用户也 可以为数据 o置a ¨ ] [ aege l / / 声明 控制器 的操 作 表声明一个 M o d e l 类来处理它, 该自 定义 的 M o d e l 类名必须和数据表 矗 l ∞ l I I d “ O l 口 名相 同 ( I d e a P H P通过 类名 找对应 的表 处理 ) 。如 ,某数 据库 中有 i d e a me s s ge、 a i d e ai ma g e和 i d e a u s e r 三张表( 其中 i d e a _为表名前 缀 , f l m眈 t o n^ d d ‘ ' I Q 会自 动处 理) . 就需要在 当前应 用的 m o d e l s目录下创建 m e s s a g e . c l a s s . 霉 t l ∞ i n _ 鼍 譬 t O 1 日 p h p , i m ge a . c l a s s . p h p 和u s e r . c l a s s . p h p 三个文件 ,且每个文件默认继承 系统 中的 D B类。此外 . 程序员也可 以使用 e x t e n d s 继承一个 自定义的 nm o t t ∞ d t 1 Ot 日 公用父类 . 用 于构建 共用的属性和方法 , 但 该 自定义父类也会 自动继 蚺 州: 童 。 曩 岫 O1 日 承系统 内置的 D B类 ’ 3 - 3 视图 v i e w) 图 3 控制器 I ma g e类结构 视 图( V i e w) 是用户看到并与之交互 的界 面。Vi e w层 用于与用户 的交互 . C o n t r o l l e r 层是 M o d e l 与V i e w之间沟通的桥梁 . 它根据用户的 3 . 2 模型 ( m o d e l 1 请求选择恰 当的视图显示 。I d e a P H P框架 内置最流行的 S m a r t y 模板 表 1 内置的数据库操作接 口及描述

PHP框架如何实现MVC模式以及单一入口

PHP框架如何实现MVC模式以及单一入口

PHP框架如何实现MVC模式以及单⼀⼊⼝这⾥不详细讲解何为MVC模式,只是简单介绍,关于MVC的具体信息可以去⽹络上找寻,MVC模式在我理解来它将⼀个项⽬分解成三部分,分别是Model(模型),View(视图),Controller(控制器),这三个单词的缩写组合即为MVC.MVC是⼀种普遍的软件敏捷开发模式,在许多领域特别是桌⾯编程领域早已经得到了⼴泛的应⽤,然⽽在像php⼀样的脚本语⾔中⽐较难以实现,特别是⼏年前在脚本语⾔中很难看到MVC的实现,但是今年随着众多框架的涌现,MVC在各个框架中得到了初步实现,其他框架中的实现⽅式暂且不提,这⾥只是介绍codeigniter是如何实现MVC的. 关于单⼀⼊⼝ 单⼀⼊⼝指在⼀个⽹站(应⽤程序)中,所有的请求都是指向⼀个脚本⽂件的,例如CI中的http:\\localhost\index.php,所有对应⽤程序的访问都是必须通过这个⼊⼝,正是单⼀⼊⼝才使得MVC模式得以实现,因为当你访问index.php的时候,应⽤程序会做⼤量的初始化⼯作,调⽤⼤量的基础类库,并根据index.php后⾯的参数加载控制器,然后加载试图,模型等内容信息. ci的所有⽂件加载都要经过控制器调⽤,因为控制器是CI中的超类,也就是其他的类都依附于它,所以⽤单⼀⼊⼝⽅式访问CI应⽤程序的时候,需要在index.php的后⾯加上控制器名和控制器中的⽅法名,如果你对于此没有任何概念或者⽆法理解,可以去CI的官⽅⽹站下载它的官⽅⽂档,然后详细了解它的⼯作⽅式 CI的官⽅⽂档⾮常详尽易懂,这⾥描述的是⽂档上所不存在的基本原理部分. 开始 或许应该先讲解CI的控制器是如何⼯作的,CI中的⼀个控制器就是⽤户编写的⼀个类,它继承⾃系统的Controller类,例如假设我们要构建⼀个可以通过http:\\localhost\index.php\control\func\m1\m2访问的页⾯,我们需要做哪些⼯作呢,⾸先我们要在system\application\controllers\⽂件夹下新建⼀个⽂件contro.php⽂件,这个⽂件即是我们要访问的控制器类所在⽂件,在此⽂件中创建以下内容:1 class Controller extends Controller23 nController()45parent::Controller(); 6 7 8 n func($m1,$m2)910$this->load->model("MSomemodel","",TRUE);11$data["data1"]=$this->MSomemodel->getvalue();12$this->load->view("welcome",$data);131415 这并不是⼀个控制器的基本组成部分,⽽是包含了model和view的⼀个控制器例⼦, ⾸先注意控制器的类名应该是⾸字母⼤写的,然后在类的构造函数⾥应该调⽤⽗类的构造函数,之后则是func()⽅法,也就是url后⾯所带参数的第⼆个部分,这个⽅法带有两个参数,这两个参数的值就是url的第三部分和第四部分的值,也就是单⼀⼊⼝的访问⽅式实际是:http:\\localhost\index.php\控制器名\⽅法名\⽅法的参数1\⽅法的参数2\...... 在控制器类中每个⽅法代表⼀个页⾯,也就是可以将很多类似的操作放到⼀个控制器中,实现对操作的统⼀ 在上述的例⼦中的func()⽅法中的其他部分分别加载了model和view,加载model的时候加载的是在models⽂件夹中的msomemodel.php⽂件中的MSomemodel类,这个类负责应⽤程序的模型部分,也就是负责数据的交换,例如数据库的存储. 然后我们通过$data=$this->MSomemodel->getvalue()执⾏了model中的⼀个⽅法,并从这个⽅法返回了数据,然后赋值给$data["data1"],$data是⼀个关联数组,我们通过这个数组向view视图⽂件传值,⽽不是使⽤常见的模板模式,这种⽅法更好地分离了MVC各个部分的处理,同时在性能⽅⾯有其独特的⼀⾯. 之后我们通过将$data数组传给views⽂件夹中的welcome.php⽂件,这个⽂件是常规的php和html混写的脚本,在这个脚本中可以利⽤传过来的$data数组输出信息,但是注意在view⽂件中输出信息的时候不必使⽤$data["data1"],⽽只需要echo$data1;即可. 基本的⼯作⽅式就是这样的,下⾯从代码级别来分析实现 代码分析 在CI中将Controller类作为超类来处理,也就是所有加载MVC实现模式的进程都从Controller类开始,所以我们忽略CI在加载到这个类的时刻前⾯的执⾏过程,⽽直接从Controller类所在的⽂件开始分析. Controller类所在的⽂件位于system/libraries/Controller.php⽂件中. 在这个类中⾸先加载了所有必须的基础类,包括:"Config","Input", "Benchmark","URI","Output", "Language","Router"类.之后加载Roader类并执⾏了它的_ci_autoloader()⽅法,这个类是MVC模式的核⼼,控制器中所有其他内容的加载都是通过它实现的,下⾯对其代码进⾏分析: ⾸先来看_ci_autoloader()⽅法,这个函数实现了⾃动加载某些类库或者类,如果在你的应⽤程序中总是要⽤到某些类,但是你⼜不确保在CI中是否已经⾃动加载了这些类的话,你可以在config/autoload.php⽂件中设定要⾃动加载的library或者helper或者plugin的数组.具体请参考⼿册. ⾸先看看CI是如何加载libraries的,这个⽅法允许你在你的控制器的任何地⽅(通常是构造函数⾥)使⽤$this->load->library("name");来加载某个类,这个类可以是⽤户⾃定义的类也可以是系统的类库,⽤户⾃定义的类需要遵循CI的约定,具体信息见⼿册中的"创建你⾃⼰的类库"部分.library()⽅法以⼀个字符串或者⼀个类库名称的数组作为第⼀个参数,之后的处理将遍历然后加载所有的类,你可以通过第⼆个参数向要加载的类的构造函数传递参数,第三个参数允许你定义返回的对象的名称,后⾯的两个参数通常不使⽤,这个⽅法在简单判断了参数是否为空之后调⽤了⽅法_ci_load_class($class,$ms= NULL, $t_name=NULL),这是⼀个⾮常复杂的函数,这个类加载第⼀个参数所指定的类,在这个类中进⾏了复杂的路径判断之后找到了所需要的类⽂件之后,调⽤了⽅法_ci_init_class($class,"",$ms,$t_name);这个类⽤来实例化⼀个类,如果在加载这个类的语句中包含了上述的第三个参数,则返回⼀个实例,以这个参数作为实例名,如果没有设置第三个参数,则返回⼀个以类名命名的实例名,这也是为什么前⾯的例⼦中在加载了model之后,直接将model类名作为⼀个对象使⽤的原因. 之后我们来看CI是如何加载模型的,这个⽅法允许你在控制器中使⽤$this->load->model($modelname,$name,$db_conn)加载模型,这三个参数分别是加载的模型的名称,加载后实例化的对象名称,是否⾃动连接数据库.后⾯两个参数可以省略,你可以讲多个模型⼀次载⼊,只需要将第⼀个参数设置成数组即可,这个⽅法⾸先将传过来的第⼀个参数以"\"分解成数组,这种机制允许你在模型中创建多层⽂件夹,更加合理地安排代码的分组,之后程序取出数组的最后⼀个元素作为要加载的类的名称,并根据路径寻找此类,之后包含此⽂件,并实例化此类,如果设置了第⼆个参数,则实例化到$name的对象中,否则默认以类名作为对象名进⾏实例化. 再来看CI是如何加载视图的,view($view, $vars = array(), $return=FALSE)⽅法的第⼀个参数是要加载的视图名称,第⼆个参数是要传给视图的变量值,第三个参数指定是否返回输出缓冲区的数据.这个⽅法将所有数组作为⼀个数组参数调⽤了_ci_load($_ci_data)⽅法,这个⽅法将传过来的变量数组通过extract()函数解析成符号表(也就是将键名当作变量名,值作为变量的值),并将这些变量缓存起来,以便可以再不同的视图中能够互相交流变量,也就是这个⽅法允许调⽤多次,为了在每次调⽤时都能⾃动加载已经传给前⾯视图的变量,将所有传给视图的变量都缓存在类的⼀个属性中,这样每次调⽤⽅法的时候都会获取所有的变量.之后加载这个视图⽂件,然后将其作为输出缓冲的⼀部分赋给全局变量$OUT,这个变量⽤来控制缓冲输出,这样做可以提⾼效率以及可以使调试的时间更准确. 其他的加载⽅法和上述的⽅法原理基本相同,只是根据情况有少许改变,CI在实现MVC模式的⽅法中将所有的⽂件都包含在控制器中,我们在包含了这些⽂件后,可以再控制器中⾃由使⽤这些对象和数据,然后最后通过缓冲输出类来输出所有的数据,虽然Loader这个类的结构看起来很复杂,但是其实它的实现时很简单的,其内部的代码原理基本相同,⽽且清晰明了,仔细看的话不难理解.。

基于PHP的简单MVC框架的设计与制作

基于PHP的简单MVC框架的设计与制作

基于PHP的简单MVC框架的设计与制作摘要:PHP称为超文本预处理器,是比较流行的网页程序设计脚本语言。

MVC是比较流行的程序设计规范。

本设计讲解如何通过PHP脚本语言设计出简单MVC框架建立网站的方法。

关键词:PHP;MVC;网页设计PHP是目前比较流行的网页程序设计脚本语言。

MVC(Model View Controller)是模型、视图、控制器的缩写,是一种程序设计规范,主要目的是分离模型和视图,通过控制器管理所有的查询和显示过程,而且MVC框架编写的程序更易于扩展,方便日后的功能扩展和维护工作。

1 数据模型设计MVC基本框架需要3个文件,分别是test_model.php、test_controller.php、test_view.php,分别对应模型、控制器、视图。

首先编写test_model.php,创建test_model类,包含数据库连接和查询过程,本实例因篇幅原因简单用变量代替复杂的数据查询。

内容如下:my_mvc();}/*构建赋值过程,如果需要数据库,那么可以在此连接数据库*/public function my_mvc(){$this->text1 = “PHP”;$this->text2 = “MVC”;}//在此生成需要显示在视图中的一些数据内容public function view_data(){$view_text = “基于” . $this->text1;$view_text.= “的” . $this->text2 . “框架”;return $view_text;}}?>2 控制器设计其次编写的是控制器test_controller.php部分,控制器部分包含通过实例化test_model并用其中的view_data方法得到的数据,并发送到视图中。

view_data();}//显示控制部分,通过数据模型获取数据并显示到视图中public function view_data(){$data_model = new test_model();/*通过数据模型类的view_data方法制作出来的数据放到变量中*/$view_data = $data_model->view_data();//通过加载视图文件,将数据显示到视图中require_once “test_view.php”;}}?>3 视图和首页设计视图是显示数据的部分,只需要使用html编写规范设计网页就可以了。

理解PHP中的MVC编程之MVC框架简介

理解PHP中的MVC编程之MVC框架简介

【什么是MVC?】MVC是一个可以让你把“三个部分(即MVC的全称,Model、View、Control ler)”谐调地组成一个复杂应用程序的概念。

一辆汽车就是一个在现实生活中非常好的MVC例子。

我们看车都看两个View(显示)部分:内部和外部。

而这两个都离不开一个Controller(控制者):司机。

刹车系统、方向盘和其他操控系统代表了Model(模型):他们从司机(Controller)那里取得控制方法然后应用到内部和外观(View)。

【网络上的MVC】MVC框架所涵盖的概念相当简单并且极度灵活。

基本的概念就是,你有一个单独的控制器(如index.php)用来控制所有建立在参数请求基础上的框架内应用程序。

这个控制器通常包含了(最小程度上)一个定义模型的参数、一个事件和一个GET参数。

这样控制器就能确认所有的请求然后运行相应的事件。

打个比方来说,一个像这样/index.php?module=foo&event=bar的请求很有可能就是用来载入一个名叫foo的类,然后运行foo::bar()[就是其中的bar()函数]。

这样做的好处有:一个对应所有应用程序的接口同时维护一个应用程序内无数的代码非常麻烦,因为每一段代码都有自己的相对路径、数据库链接、验证等等。

而这样做就免除你在这方面的烦恼,允许你合并并重复使用代码【为什么要创建作者自己的MVC框架?】迄今为止,我没有见到过太多用PHP写的MVC框架。

事实上我仅仅知道一个-Solar,是完全用PHP5写的。

另外一个是Cake,一个试图成为PHP的RoR(R uby on Rails-一个Ruby语言开源网络框架)。

我自己对这两个框架都有一些不满意的地方:它们都没有利用到PEAR,Smarty等所包含的现有代码;现在的Cake还比较紊乱;最后,Solar是一个绝大部分由一个人写的作品(我无意说其作者Paul不是一个好人或者好程序员)。

这些问题可能并不会让你否认它们,而且很有可能你根本不关心这些问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

教程:使用PHP开发自己的MVC框架一、什么是MVCMVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。

除此之外,此模式通过对复杂度的简化,使程序结构更加直观。

软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。

专业人员可以通过自身的专长分组:∙(控制器Controller)- 负责转发请求,对请求进行处理。

∙(视图View)–界面设计人员进行图形界面设计。

∙(模型Model)–程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能)。

模型(Model)“数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。

“模型”有对数据直接访问的权力,例如对数据库的访问。

“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。

但是模型中数据的变化一般会通过一种刷新机制被公布。

为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。

视图(View)视图层能够实现数据有目的的显示(理论上,这不是必需的)。

在视图中一般没有程序上的逻辑。

为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。

控制器(Controller)控制器起到不同层面间的组织作用,用于控制应用程序的流程。

它处理事件并作出响应。

“事件”包括用户的行为和数据模型上的改变。

二、为什么要自己开发MVC框架网络上有大量优秀的MVC框架可供使用,本教程并不是为了开发一个全面的、终极的MVC框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,你将学习面向对象编程和设计模式,并学习到开放中的一些注意事项。

更重要的是,你可以完全控制你的框架,并将你的想法融入到你开发的框架中。

虽然不一定是做好的,但是你可以按照你的方式去开发功能和模块。

三、开始开发自己的MVC框架在开始开发前,让我们先来把项目建立好,假设我们建立的项目为todo,那么接下来的第一步就是把目录结构先设置好。

虽然在这个教程中不会使用到上面的所有的目录,但是为了以后程序的可拓展性,在一开始就把程序目录设置好使非常必要的。

下面就具体说说每个目录的作用:∙application –存放程序代码∙config –存放程序配置或数据库配置∙db –用来存放数据库备份内容∙library –存放框架代码∙public –存放静态文件∙scripts –存放命令行工具∙tmp –存放临时数据在目录设置好以后,我们接下来就要来顶一下一些代码的规范:1.MySQL的表名需小写并采用复数形式,如items,cars2.模块名(Models)需首字母大写,并采用单数模式,如Item,Car3.控制器(Controllers)需首字母大写,采用复数形式并在名称中添加“Controller”,如ItemsController, CarsController4.视图(Views)采用复数形式,并在后面添加行为作为文件,如:items/view.php,cars/buy.php1 2 3 4 5 &lt;IfModule mod_rewrite.c&gt; RewriteEngine on RewriteRule ^$ public/ [L] RewriteRule (.*) public/$1 [L] &lt;/IfModule&gt;1 2 3 4 5 6 7 8 9 &lt;IfModule mod_rewrite.c&gt;RewriteEngine On#如果文件存在就直接访问目录不进行RewriteRule RewriteCond %{REQUEST_FILENAME} !-f#如果目录存在就直接访问目录不进行RewriteRule RewriteCond %{REQUEST_FILENAME} !-d#将所有其他URL重写到index.php/URL RewriteRule ^(.*)$ index.php?url=$1 [PT,L]&lt;/IfModule&gt;这么做的主要原因有:1.可以使程序有一个单一的入口,将所有除静态程序以外的程序都重定向到index.php上;2.可以用来生成利于SEO的URL,想要更好的配置URL,后期可能会需要URL路由,这里先不做介绍了。

1 2 3 4 5 &lt;?phpdefine('DS',DIRECTORY_SEPARATOR);define('ROOT',dirname(dirname(__FILE__)));$url = $_GET['url'];require_once(ROOT.DS.'library'.DS.'bootstrap.php');注意上面的PHP代码中,并没有添加PHP结束符号”?>”,这么做的主要原因是:对于只包含PHP代码的文件,结束标志(“?>”)最好不存在,PHP自身并不需要结束符号,不添加结束符号可以很大程度上防止末尾被添加额外的注入内容,让程序更加安全。

在index.php中,我们对library文件夹下的bootstrap.php发起了请求,那么bootstrap.php这个启动文件中到底会包含哪些内容呢?1 2 3 &lt;?phprequire_once(ROOT.DS.'config'.DS .'config.php');require_once(ROOT.DS.'library'.DS .'shared.php');1 2 3 4 5 6 7 8 &lt;?php# 设置是否为开发状态define('DEVELOPMENT_ENVIRONMENT',true);# 设置数据库连接所需数据define('DB_HOST','localhost');define('DB_NAME','todo');define('DB_USER','root');define('DB_PASSWORD','root');1 2 3 4 5 6 7 8 9 &lt;?php/* 检查是否为开发环境并设置是否记录错误日志 */function setReporting(){if (DEVELOPMENT_ENVIRONMENT == true) {error_reporting(E_ALL);ini_set('display_errors','On');} else {error_reporting(E_ALL);ini_set('display_errors','Off');1011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 ini_set('log_errors','On');ini_set('error_log',ROOT.DS. 'tmp' .DS. 'logs' .DS. 'error.log');}}/* 检测敏感字符转义(Magic Quotes)并移除他们*/function stripSlashDeep($value){$value = is_array($value) ? array_map('stripSlashDeep',$value) : stripslashes($value);return $value;}function removeMagicQuotes(){if (get_magic_quotes_gpc()) {$_GET = stripSlashDeep($_GET);$_POST = stripSlashDeep($_POST);$_COOKIE = stripSlashDeep($_COOKIE);}}/* 检测全局变量设置(register globals)并移除他们*/function unregisterGlobals(){if (ini_get('register_globals')) {$array = array('_SESSION','_POST','_GET','_COOKIE','_REQUEST','_SERVER','_ENV','_FILES'); foreach ($array as $value) {foreach ($GLOBALS[$value] as $key =&gt; $var) {if ($var === $GLOBALS[$key]) {unset($GLOBALS[$key]);}}}}}/* 主请求方法,主要目的拆分URL请求*/function callHook() {global $url;$urlArray = array();$urlArray = explode("/",$url);$controller = $urlArray[0];array_shift($urlArray);$action = $urlArray[0];array_shift($urlArray);$queryString = $urlArray;$controllerName = $controller;$controller = ucwords($controller);545556575859606162636465666768697071727374757677787980 $model = rtrim($controller, 's');$controller .= 'Controller';$dispatch = new $controller($model,$controllerName,$action);if ((int)method_exists($controller, $action)) {call_user_func_array(array($dispatch,$action),$queryString);} else {/* 生成错误代码*/}}/* 自动加载控制器和模型*/function __autoload($className) {if (file_exists(ROOT . DS . 'library' . DS . strtolower($className) . '.class.php')) {require_once(ROOT . DS . 'library' . DS . strtolower($className) . '.class.php');} else if (file_exists(ROOT . DS . 'application' . DS . 'controllers' . DS . strtolower($className) . '.php')) { require_once(ROOT . DS . 'application' . DS . 'controllers' . DS . strtolower($className) . '.php');} else if (file_exists(ROOT . DS . 'application' . DS . 'models' . DS . strtolower($className) . '.php')) {require_once(ROOT . DS . 'application' . DS . 'models' . DS . strtolower($className) . '.php');} else {/* 生成错误代码*/}}setReporting();removeMagicQuotes();unregisterGlobals();callHook();1 2 3 4 5 6 &lt;?phpclass Controller { protected $_model; protected $_controller; protected $_action; protected $_template;7 8 91011121314151617181920 function __construct($model, $controller,$action) {$this-&gt;_controller = $controller;$this-&gt;_action = $action;$this-&gt;_model = $model;$this-&gt;$model =&amp; new $model;$this-&gt;_template =&amp; new Template($controller,$action); }function set($name,$value) {$this-&gt;_template-&gt;set($name,$value);}function __destruct() {$this-&gt;_template-&gt;render();}}1 2 3 4 5 6 7 8 9101112131415161718 &lt;?phpclass SQLQuery {protected $_dbHandle;protected $_result;/** 连接数据库**/function connect($address, $account, $pwd, $name) {$this-&gt;_dbHandle = @mysql_connect($address, $account, $pwd); if ($this-&gt;_dbHandle != 0) {if (mysql_select_db($name, $this-&gt;_dbHandle)) {return 1;}else {return 0;}}else {return 0;}1920212223242526272829303132333435363738394041424344454647484950515253545556575859606162}/** 中断数据库连接**/function disconnect() {if (@mysql_close($this-&gt;_dbHandle) != 0) {return 1;} else {return 0;}}/** 查询所有数据表内容**/function selectAll() {$query = 'select * from `'.$this-&gt;_table.'`';return $this-&gt;query($query);}/** 查询数据表指定列内容**/function select($id) {$query = 'select * from `'.$this-&gt;_table.'` where `id` = \''.mysql_real_escape_string($id).'\''; return $this-&gt;query($query, 1);}/** 自定义SQL查询语句**/function query($query, $singleResult = 0) {$this-&gt;_result = mysql_query($query, $this-&gt;_dbHandle);if (preg_match("/select/i",$query)) {$result = array();$table = array();$field = array();$tempResults = array();$numOfFields = mysql_num_fields($this-&gt;_result);for ($i = 0; $i &lt; $numOfFields; ++$i) {array_push($table,mysql_field_table($this-&gt;_result, $i));array_push($field,mysql_field_name($this-&gt;_result, $i));}while ($row = mysql_fetch_row($this-&gt;_result)) {for ($i = 0;$i &lt; $numOfFields; ++$i) {$table[$i] = trim(ucfirst($table[$i]),"s");$tempResults[$table[$i]][$field[$i]] = $row[$i];}if ($singleResult == 1) {mysql_free_result($this-&gt;_result);return $tempResults;}array_push($result,$tempResults);}mysql_free_result($this-&gt;_result);63646566676869707172737475767778return($result);}}/** 返回结果集行数**/function getNumRows() {return mysql_num_rows($this-&gt;_result); }/** 释放结果集内存**/function freeResult() {mysql_free_result($this-&gt;_result);}/** 返回MySQL操作错误信息**/ function getError() {return mysql_error($this-&gt;_dbHandle); }}1 2 3 4 5 6 7 8 91011 &lt;?phpclass Model extends SQLQuery{protected $_model;function __construct() {$this-&gt;connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME); $this-&gt;_model = get_class($this);$this-&gt;_table = strtolower($this-&gt;_model)."s";}function __destruct() {}}1 2 3 4 &lt;?phpclass Template {protected $variables = array(); protected $_controller;5 6 7 8 91011121314151617181920212223242526272829protected $_action;function __construct($controller,$action) {$this-&gt;_controller = $controller;$this-&gt;_action =$action;}/* 设置变量*/function set($name,$value) {$this-&gt;variables[$name] = $value;}/* 显示模板*/function render() {extract($this-&gt;variables);if (file_exists(ROOT.DS. 'application' .DS. 'views' .DS. $this-&gt;_controller .DS. 'header.php')) { include(ROOT.DS. 'application' .DS. 'views' .DS. $this-&gt;_controller .DS. 'header.php');} else {include(ROOT.DS. 'application' .DS. 'views' .DS. 'header.php');}include (ROOT.DS. 'application' .DS. 'views' .DS. $this-&gt;_controller .DS. $this-&gt;_action . '.php'); if (file_exists(ROOT.DS. 'application' .DS. 'views' .DS. $this-&gt;_controller .DS. 'footer.php')) { include (ROOT.DS. 'application' .DS. 'views' .DS. $this-&gt;_controller .DS. 'footer.php');} else {include (ROOT.DS. 'application' .DS. 'views' .DS. 'footer.php');}}}1 2 3 4 5 6 7 &lt;?phpclass ItemsController extends Controller { function view($id = null,$name = null) {$this-&gt;set('title',$name.' - My Todo List App'); $this-&gt;set('todo',$this-&gt;Item-&gt;select($id)); }function viewall() {8 91011121314151617181920$this-&gt;set('title','All Items - My Todo List App');$this-&gt;set('todo',$this-&gt;Item-&gt;selectAll());}function add() {$todo = $_POST['todo'];$this-&gt;set('title','Success - My Todo List App');$this-&gt;set('todo',$this-&gt;Item-&gt;query('insert into items (item_name) values (\''.mysql_real_escape_string($todo).'\')'));}function delete($id) {$this-&gt;set('title','Success - My Todo List App');$this-&gt;set('todo',$this-&gt;Item-&gt;query('delete from items where id =\''.mysql_real_escape_string($id).'\''));}}1 2 3 &lt;?phpclass Item extends Model { }1 &lt;h2&gt;&lt;?php echo $todo['Item']['item_name']?&gt;&lt;/h2&gt;2 3 4 &lt;a href="../../../items/delete/&lt;?php echo $todo['Item']['id']?&gt;"&gt; &lt;span&gt;Delete this item&lt;/span&gt;&lt;/a&gt;1 2 3 4 5 6 7 8 910111213 &lt;form action="../items/add" method="post"&gt;&lt;input type="text" value="I have to..." onclick="this.value=''" name="todo"&gt; &lt;input type="submit" value="add"&gt;&lt;/form&gt;&lt;br/&gt;&lt;br/&gt;&lt;?php $number = 0?&gt;&lt;?php foreach ($todo as $todoitem):?&gt;&lt;a href="../items/view/&lt;?php echo $todoitem['Item']['id']?&gt;/&lt;?php echo strtolower(str_replace(" ","-",$todoitem['Item']['item_name']))?&gt;"&gt;&lt;span&gt;&lt;?php echo ++$number?&gt;&lt;?php echo $todoitem['Item']['item_name']?&gt;&lt;/span&gt;&lt;/a&gt;&lt;br/&gt;&lt;?php endforeach?&gt;1 &lt;a href="../items/viewall"&gt;Todo successfully added. Click here to go back.&lt;/a&gt;&lt;br/&gt;1 &lt;a href="../../items/viewall"&gt;Todo successfully deleted. Click here to go back.&lt;/a&gt;&lt;br/&gt; header.php:页首文件1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 &lt;html&gt;&lt;head&gt;&lt;title&gt;&lt;?php echo $title?&gt;&lt;/title&gt;&lt;style&gt;.item {width:400px;}input{color:#222222;font-family:georgia,times;font-size:24px;font-weight:normal;line-height:1.2em;color:black;} a{color:#222222;font-family:georgia,times;font-size:24px;font-weight:normal;line-height:1.2em;color:black;text -decoration:none;}a:hover {background-color:#BCFC3D;}h1{color:#000000;font-size:41px;letter-spacing:-2px;line-height:1em;font-family:helvetica,arial,sans-serif;border-bottom:1px dotted #cccccc;}h2 {color:#000000;font-size:34px;letter-spacing:-2px;line-height:1em;font-family:helvetica,arial,sans-serif;} &lt;/style&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;My Todo-List App&lt;/h1&gt;12&lt;/body&gt;&lt;/html&gt;1 2 3 4 5 CREATE TABLE IF NOT EXISTS `items` (`id` int(11) NOT NULL AUTO_INCREMENT,`item_name` varchar(255) NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;至此一个使用MVC开发的网站就开发完成了,你现在可以通过访问http://localhost/todo/items/viewall 查看新建的站点。

相关文档
最新文档