hello,大家好今天要给大家分享的是php的进阶教程 ,通过本教程讲同学们将学会如何一步步实现MVC的架构,打造自己的MVC框架 还记得上次分享给同学们的教程 “php基础-设计模式”的中用到的各种模式吗?这些模式会在本章学习MVC架构时用到。
说了那么多,那MVC究竟是个什么鬼?我们首先看个图,来直观的感受下。
通过上图,大家可以很清楚地看到 ,首先是浏览器发送请求,通过路由找到controller,然后由controller 去调度view 和modelController:调度 model和view层的调度器。
Model: 处理业务代码,并与数据库交互View:controller获取model的数据后将数据渲染到View(返回html),最终呈现给浏览器端 了解了MVC的架构,也不难看出,这是个责任清晰的三层模型,每一层都有自己的责任。
Controller负责调度model 和view ,model层处理业务view层负责渲染数据前端程序员只要管好view层的设计后端程序员只需管好自己的那块业务逻辑各司其职协作开发大大提高了开发效率 看到这里,同学们对于为什么要使用MVC应该有了的大致 的了解了吧。
想到2007年以前,那个时代,MVC刚刚流行有很多公司不屑去用它,结果工程项目大了,人多了,大家各自为政,写了很多重复的东西一个项目要组合在一起,也是要费很大的精力和时间的 同学们在了解了什么是MVC以及为什么要使用MVC后。
相信你们也是跃跃欲试,想要一探其奥秘接下来马上为大家揭开其神秘面纱 我们先来回顾下上图,任何请求都是由客户端发起,经由路由到达controller然后才由controller继续下面的操作因此让我们先看下php是如何实现这部分功能的。
先来看下这么个项目结构
等等,里面好像少了model和view到哪去了?呵呵,先别急,今天只讲路由篇,所以只看这些就够了,下一篇会有model,view,xss,csrf等等慢慢来心急吃不了那热豆腐 那我们就先从入口文件开始讲吧。
先来条醒目地分割线index.php=============================================require"Vendor/custome.php"; require (ROOT.DIRECTORY_SEPARATOR.
"Vendor/lib/autoload.php"); require"http/router.php";=============================================可以看见就三行代码。
Vendor/custome.php=============================================define("ROOT",dirname(dirname(__FILE__)));
=============================================定义了项目根目录,这个有什么鸟用?其实在我们require 一个php文件时,都是根据这个根目录来的我这的项目的那个根就是 。
php-mvc-stepbystep。注意:__FILE__:当前目录所在文件,这里指的就是
define("ROOT",dirname(dirname(__FILE__)));文件所在父目录,即 php-mvc-stepbystep 目录 Vendor/autoload.php=============================================
classMyAutoLoad{ staticfunctiondoPrint($classname){ $classPath = str_replace("\\","/",$classname);
if(is_file(ROOT.DIRECTORY_SEPARATOR.$classPath.".php")) { require_once (ROOT.DIRECTORY_SEPARATOR.$classPath.
".php"); } } } spl_autoload_register(array(MyAutoLoad,doPrint));=============================================
我们先来说个函数function __autoload($classname)这个函数的作用就是自定加载类这个自动加载类又是个什么鬼? 话说php5之前还没有这个函数它有什么作用呢?回想当初,我们要引入一个php文件,那么就得require "xxx.php",那如果要引入很多文件呢?哦。
MyGod 拿得多累啊!!!! 所有后来php的创建者就开发这个功能你可以不用一个个引入php文件只需要如此便可举个例子Vendor/lib/autoload.php =============================================
function__autoload($classname){ $classPath = str_replace("\\","/",$classname);//将名称空间转换成类文件所在目录
if(is_file(ROOT.DIRECTORY_SEPARATOR.$classPath.".php")) { require_once (ROOT.DIRECTORY_SEPARATOR.$classPath.
".php"); } }=============================================php-mvc-stepbystep/index.php =============================================
require (ROOT.DIRECTORY_SEPARATOR."Vendor/lib/autoload.php");use Test\TestTest::sayHello();=============================================
php-mvc-stepbystep/Test/Test.php =============================================namespaceTest; classTest
{ staticfunctionsayHello(){ echo"hello"; } }=============================================
注意:index.php在引入auload.php后 无需 require "Test/Test.php" 尽然也能执行神奇吧,这就是autoload的好处这里的namespace 就是文件所在位置而 。
类名必须与文件名一致 在充分了解__autoload($classname)后,再来看下sp_autoload_register(array(自定义autoload类,方法))如果这个函数参数为空,则默认调用__autoload($classname),否则
就调用自定义类种的方法现在再回过头来看下Vendor/autoload.php=============================================classMyAutoLoad{
staticfunctiondoPrint($classname){ $classPath = str_replace("\\","/",$classname);//将namespace 转换成类文件目录
if(is_file(ROOT.DIRECTORY_SEPARATOR.$classPath.".php"))//判断文件是否存在 { require_once (ROOT.DIRECTORY_SEPARATOR.$classPath.
".php");//引入文件 } } } spl_autoload_register(array(MyAutoLoad,doPrint));=============================================
http/router.php=============================================
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。