1、什么是MVC框架?

MVC是一段英文单词的缩写,它的全文是Model View Controller;
也就是模型-视图-控制器的缩写,MVC是一由多种软件设计模式组合而成的,复合型业务设计模式。
MVC基于PHP面向对象的Class类封装,用一种业务逻辑、数据、界面显示分离的方法组织代码,
事实上,我们在炼气期升阶考试中所编写的代码,就是MVC的模型。
最简单的MVC可以理解为,将业务逻辑划分为三层的一种架构设计,主要采用封装(分层)的思想,来降低耦合度,从而使我们的系统更灵活,扩展性更好。
model:是应用程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据。
view:是应用程序中处理数据显示的部分。通常视图是依据数据模型创建的。
controller:是应用程序中处理数据交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送。
同时记住,MVC框架基本都依赖单一入口与路由器进行上面所说的业务分层出来。

2、MVC框架的优点

  1. 1、多个视图共享一个模型,大大提高代码的可重用性。
  2. 2、三个层次相互独立,改变其中一个不会影响其他层级的运行,所以依据这种设计模式能构建良好的松耦合性的组件。
  3. 3、控制器提高了应用程序的灵活性和可控制性。控制器可以用来连接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提高强有力的手段。

3、MVC框架的缺点

1、增加了系统结构和实现的复杂性。
对于简单的页面或项目,严格遵循MVC设计,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
2、视图与控制器过于紧密的连接。
简单的MVC设计中,视图与控制器是相互分离,但确实又是一个紧密关联的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。
3、视图对模型数据的低效率访问。
依据模型操作的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
这一点一般需要加数据缓存功能才能够彻底解决。
4、目前,一些高级的界面工具或代码构造器不支持MVC框架。
目前市面上的代码构造器,都只支持一些较为出名的开源MVC框架,例如ThinkPHP3.2、Laravel5等。
综上,对于开发存在大量用户界面,并且业务逻辑复杂的大型应用程序,MVC将会使你的软件在健壮性、代码重用和结构方面上一个新的台阶。
尽管在最初构建MVC框架时会花费一定的工作量,但从长远角度看,它会大大提高后期软件开发的效率。
所以我们在具体适用时,要综合考虑其适用范围。

4、MVC框架的流程设计图

image.png从上图可以很容易的看出,执行流程是从

  1. -> 单一入口开始
  2. -> 初始化一些常量等参数
  3. -> 启动框架性能加载监听
  4. -> 启动错误异常监听
  5. -> 命名空间分组导入,实现框架类文件加载功能
  6. -> 基于PHP反射机制,实现行为扩展功能
  7. -> 基于命名空间实现路由表路由功能
  8. -> 路由器检测控制器是否存在,存在则加载,不存在则检测视图是否存在,存在则解析缓存并显示。
  9. -> 控制器和视图中可独立调用数据库模型
  10. -> 框架执行结束

5、MVC框架的开发标准和注意事项

开发环境必须兼容PHP5.4+以上版本,
同时兼容Windows和Linux操作系统,
所有类名统一使用大驼峰写法,文件名既类名。
其余文件名和文件夹名,均统一使用小写。
并且路由的关键词全转小写,它多余的参数则大小不变。

6、初始目录结构

  1. ThinkMIMI WEB部署目录(或者子目录)
  2. ├─index.php 单一入口文件
  3. ├─application 应用目录
  4. └─thinkmimi 框架核心文件目录

(下一次更新目录架构时,新增的内容会用《》标签表示)
下面朋友们先将以上的目录在自己的本地环境中架设完成, application目录主要是用于存放开发者自定义的业务逻辑代码,按照MVC框架给出的一些规范来管理代码和进行日常开发工作。
主要是用于存放以下内容:

  1. 1、控制器代码
  2. 2、数据库操作代码
  3. 3、视图文件
  4. 4、项目配置和函数文件
  5. 5、分组独立配置和函数文件
  6. 6、前后置操作类
  7. 7、钩子插件
  8. 8、项目路由表等

7、初始化框架核心文件 与 入口引用

我们先来看下新的目录结构:

  1. ThinkMIMI WEB部署目录(或者子目录)
  2. ├─index.php 单一入口文件
  3. ├─application 应用目录
  4. └─thinkmimi 框架核心文件目录
  5. └─《base.php 框架核心核心文件

下面,我们来修改单一入口的代码,用于引入这个核心文件进行框架加载:
文件路径:/ThinkMIMI/index.php

  1. <?php
  2. # 加载框架引导文件
  3. require __DIR__ . '/thinkmimi/base.php';

下面我们再继续创建新增的base.php文件,写入以下代码:

  1. <?php
  2. # 框架当前版本
  3. define('THINK_VERSION', '1.0.1');
  4. # 程序开始的执行时间戳
  5. define('THINK_START_TIME', microtime(true));
  6. # 程序开始时的内存量
  7. define('THINK_START_MEM', memory_get_usage());
  8. # 文件后缀名
  9. define('EXT', '.php');
  10. # 服务器文件分隔符号
  11. define('DS', DIRECTORY_SEPARATOR);
  12. # 调试模式
  13. defined('APP_DEBUG') or define('APP_DEBUG', true);
  14. # 框架应用文件夹名
  15. defined('APP_LICATION') or define('APP_LICATION', 'application');
  16. # 框架核心文件的根目录地址
  17. defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
  18. # 框架核心文件的目录地址
  19. define('LIB_PATH', THINK_PATH . 'library' . DS);
  20. # 相对于项目根目录地址-用于引入文件
  21. defined('APP_PATH') or define('APP_PATH', dirname(THINK_PATH).DS);
  22. # 相对于浏览器的项目根目录地址-用于加载静态文件
  23. defined('ROOT_PATH') or define('ROOT_PATH', str_replace(basename($_SERVER['SCRIPT_NAME']), '',$_SERVER['SCRIPT_NAME']));
  24. # 框架缓存与日志文件根目录地址
  25. defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH . 'runtime' . DS);
  26. # 日志文件存放地址
  27. defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
  28. # 视图解析文件存放地址
  29. defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);
  30. echo THINK_PATH;

base.php的作用,主要是用于初始化框架所需要的一些必备常量,以方便后续开发中进行统一管理。
同时该文件后续还会引入一些框架相关的核心文件,并进行框架初始化。
现在我们通过浏览器访问index.php文件,就能看到输出了框架核心文件目录的绝对路径。