博客列表 >MVC与常用设计模式

MVC与常用设计模式

王佳祥
王佳祥原创
2020年08月05日 15:54:271075浏览

MVC与常用设计模式

一、MVC

1.基本概念

  • Model(模型),程序应用功能的实现,程序的逻辑的实现。在PHP中负责数据管理,数据生成。

  • View(视图),图形界面逻辑。在PHP中负责输出,处理如何调用模板、需要的资源文件。

  • Controller(控制器),负责转发请求,对请求处理。在PHP中根据请求决定调用的视图及使用的数据。

2.为什么使用MVC

  • MVC的主要作用是为了将代码分层、分类。

  • MVC的主要目的是为了解决Web开发中分离开发与设计工作,使其工作相对独立。

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

3.模型(Model)

  1. <?php
  2. namespace mvc_demo;
  3. use PDO;
  4. //模型类
  5. class Model
  6. {
  7. //获取数据
  8. public function getData()
  9. {
  10. return (new PDO('mysql:host=localhost;dbname=tp5','root','wang1111'))
  11. ->query('SELECT * FROM `user` LIMIT 10')->fetchAll(PDO::FETCH_ASSOC);
  12. }
  13. }
  14. //测试模型
  15. //print_r((new Model)->getData());

4.视图(View)

  1. <?php
  2. namespace mvc_demo;
  3. //视图:数据展示
  4. class View
  5. {
  6. //数据展示
  7. public function fetch($data)
  8. {
  9. //使用字符串拼接实现html代码
  10. $table = '<table>';
  11. $table .= '<caption>用户信息表</caption>';
  12. $table .= '<tr><th>ID</th><th>用户名</th><th>账号名</th></tr>';
  13. //遍历用户表
  14. foreach ($data as $user){
  15. $table .= '<tr>';
  16. $table .= '<td>'.$user['id'].'</td>';
  17. $table .= '<td>'.$user['name'].'</td>';
  18. $table .= '<td>'.$user['username'].'</td>';
  19. $table .= '</td>';
  20. }
  21. $table .='</table>';
  22. return $table;
  23. }
  24. }
  25. //require 'Model.php';
  26. //echo (new View)->fetch((new Model)->getData());

5.控制器(Controller)

  1. <?php
  2. //控制器1
  3. namespace mvc_demo;
  4. //加载模型类
  5. require 'Model.php';
  6. //加载视图类
  7. require 'View.php';
  8. class Controller1
  9. {
  10. //获取数据,并展示出来
  11. public function index()
  12. {
  13. //1.获取数据
  14. $model = new Model();
  15. $data = $model->getData();
  16. //2.渲染模板
  17. $view = new View();
  18. return $view->fetch($data);
  19. }
  20. }
  21. //客户端调用
  22. //创建控制器实例/对象
  23. $controller = new Controller1();
  24. echo $controller->index();
  25. /*
  26. 1.Model,View类的实例都是在Controller内完成的
  27. 2.控制器知道的太多,造成了当前的控制器严重依赖外部的某些对象
  28. 3.这种现象就是代码的耦合度太高
  29. */


6.服务容器

  1. <?php
  2. //控制器5:将当前依赖的外部对象,放到一个"服务容器"中进行统一管理
  3. namespace mvc_demo;
  4. use Closure;
  5. //加载模型类
  6. require 'Model.php';
  7. //加载视图类
  8. require 'View.php';
  9. /*服务容器***********************************************************************************/
  10. class Container1
  11. {
  12. //1.对象容器
  13. protected $instances = [];
  14. //2.向对象容器中添加对象
  15. //参数1:是外部对象在当前对象容器数组中的键名/别名
  16. //参数2:是当前需要绑定到容器的对象的实例化过程(函数)
  17. public function bind($alias,Closure $process)
  18. {
  19. $this->instances[$alias] = $process;
  20. }
  21. //3.从对象容器中取出对象
  22. public function make($alias,$params=[])
  23. {
  24. return call_user_func_array($this->instances[$alias],[]);
  25. }
  26. }
  27. //将外部对象:Model,View的实例绑定到服务容器中
  28. $container =new Container1;
  29. //绑定模型类
  30. $container->bind('model',function(){
  31. return new Model();
  32. });
  33. //绑定到视图类
  34. $container->bind('view',function(){
  35. return new View();
  36. });
  37. /************************************************************************************/
  38. class Controller5
  39. {
  40. //获取数据,并展示出来
  41. public function index(Container1 $container)
  42. {
  43. //1.获取数据
  44. $data = $container->make('model')->getData();
  45. //2.渲染模板
  46. return $container->make('view')->fetch($data);
  47. }
  48. //控制器依赖的外部对象,尽管已经通过依赖注入到了当前类中,但是没有办法实现外部对象复用
  49. }
  50. //客户端调用
  51. //将外部对象的注入点从普通方法中,改到了构造方法中
  52. $controller = new Controller5();
  53. echo $controller->index($container);


7.Facade模式

  1. <?php
  2. //控制器6:Facade门面技术,静态接管服务容器中的成员的访问
  3. namespace mvc_demo;
  4. use Closure;
  5. //加载模型类
  6. require 'Model.php';
  7. //加载视图类
  8. require 'View.php';
  9. /*服务容器***********************************************************************************/
  10. class Container2
  11. {
  12. //1.对象容器
  13. protected $instances = [];
  14. //2.向对象容器中添加对象
  15. //参数1:是外部对象在当前对象容器数组中的键名/别名
  16. //参数2:是当前需要绑定到容器的对象的实例化过程(函数)
  17. public function bind($alias,Closure $process)
  18. {
  19. $this->instances[$alias] = $process;
  20. }
  21. //3.从对象容器中取出对象
  22. public function make($alias,$params=[])
  23. {
  24. return call_user_func_array($this->instances[$alias],[]);
  25. }
  26. }
  27. //将外部对象:Model,View的实例绑定到服务容器中
  28. $container =new Container2;
  29. //绑定模型类
  30. $container->bind('model',function(){
  31. return new Model();
  32. });
  33. //绑定到视图类
  34. $container->bind('view',function(){
  35. return new View();
  36. });
  37. /************************************************************************************/
  38. //在服务容器与工作的控制器之间再添加一个中间层:Facade
  39. class Facade
  40. {
  41. //服务容器
  42. protected static $container = null;
  43. //初始化方法:给当前的Facade类和$container属性赋值
  44. //理解为Facade的构造方法
  45. //将外部的服务容器注入到当前的facade中
  46. public static function initialize(Container2 $container)
  47. {
  48. static::$container = $container;
  49. }
  50. }
  51. //模型类成员访问静态化(给成员套一个静态访问的马甲)
  52. /************************************************************************************/
  53. class UserModel extends Facade
  54. {
  55. public static function getData()
  56. {
  57. return static::$container->make('model')->getData();
  58. }
  59. }
  60. class UserView extends Facade
  61. {
  62. public static function fetch($data)
  63. {
  64. return static::$container->make('view')->fetch($data);
  65. }
  66. }
  67. /************************************************************************************/
  68. class Controller5
  69. {
  70. //构造方法,初始化facade
  71. public function __construct(Container2 $container)
  72. {
  73. Facade::initialize($container);
  74. }
  75. //用facade方式类成员
  76. public function index()
  77. {
  78. //1.获取数据
  79. $data = UserModel::getData();
  80. //2.渲染模板
  81. return UserView::fetch($data);
  82. }
  83. }
  84. //客户端调用
  85. //将外部对象的注入点从普通方法中,改到了构造方法中
  86. $controller = new Controller5($container);
  87. echo $controller->index();


学习总结

  • MVC就是模型(Model)、视图(View)、控制器(Controller)

  • 模型通常是数据库的操作

  • 视图是HTML页面

  • 控制器主要负责调用模型与视图

  • 服务容器,把类都放到另一个类中,可以理解为容器,然后把类都绑定到这个容器中,用的时候在取出来。

  • Facade模式,外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

  • 外观模式的就是让客户端以一种简单的方式来调用比较复杂的系统,来完成一件事情。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议