博客列表 >简单演示MVC(0804)

简单演示MVC(0804)

丶久而旧之丶
丶久而旧之丶原创
2020年09月05日 22:14:06575浏览

MVC

  • M:Model,模型,数据库操作
  • V:View,视图,页面,html
  • C:controller,控制器

模型类

  1. <?php
  2. // 模型类
  3. namespace mvc_demo;
  4. class Model
  5. {
  6. public function get()
  7. {
  8. return (new \PDO('mysql:host=localhost;dbname=user;charset=utf8', 'root', 'root'))
  9. ->query('select * from apple limit 10')->fetchAll(\PDO::FETCH_ASSOC);
  10. }
  11. }

视图类

  1. <?php
  2. // 视图类
  3. namespace mvc_demo;
  4. class view
  5. {
  6. public function fetch($date)
  7. {
  8. // 展示数据
  9. $table = '<table>';
  10. $table .= '<caption>用户信息表</caption>';
  11. $table .= '<tr><th>ID</th><th>姓名</th><th>性别</th></tr>';
  12. foreach ($date as $user) {
  13. $table .= '<tr>';
  14. $table .= '<td>' . $user['id'] . '</td>';
  15. $table .= '<td>' . $user['username'] . '</td>';
  16. $table .= '<td>' . $user['sex'] . '</td>';
  17. $table .= '</tr>';
  18. }
  19. $table .= '</table>';
  20. return $table;
  21. }
  22. }
  23. echo '<style>
  24. table{border-collapse:collapse;border:1px solid black;text-align:center;width:50%; margin:auto;}
  25. caption{font-size:150%;margin-bottom:15px;}
  26. th{background-color:wheat;}
  27. td,th{border:1px solid black;}
  28. </style>';

控制器1:实例化模型类和视图类在控制器中实现(造成代码耦合过高)

  1. <?php
  2. namespace mvc_demo;
  3. require 'model.php';
  4. require 'view.php';
  5. class Cotroller1
  6. {
  7. public function index()
  8. {
  9. // 1.获取数据
  10. $date = (new Model)->get();
  11. // 2.渲染数据
  12. return (new view)->fetch($date);
  13. }
  14. }
  15. echo (new Cotroller1)->index();

控制器2:在控制器类外部实例化模型类和视图类,通过控制器方法参数调用(外部对象不能再控制器中复用)

  1. <?php
  2. namespace mvc_demo;
  3. require 'model.php';
  4. require 'view.php';
  5. class Cotroller2
  6. {
  7. public function index($model, $view)
  8. {
  9. // 1.获取数据
  10. $date = $model->get();
  11. // 2.渲染数据
  12. return $view->fetch($date);
  13. }
  14. }
  15. $model = new Model;
  16. $view = new view;
  17. echo (new Cotroller2)->index($model, $view);

控制器3:通过控制器的构造器实例化(实现外部对象在控制器中复用)

  1. <?php
  2. namespace mvc_demo;
  3. require 'model.php';
  4. require 'view.php';
  5. class Cotroller3
  6. {
  7. private $model;
  8. private $view;
  9. public function __construct($model, $view)
  10. {
  11. $this->model = $model;
  12. $this->view = $view;
  13. }
  14. public function index()
  15. {
  16. // 1.获取数据
  17. $date = $this->model->get();
  18. // 2.渲染数据
  19. return $this->view->fetch($date);
  20. }
  21. }
  22. $model = new Model;
  23. $view = new view;
  24. echo (new Cotroller3($model, $view))->index();

服务容器:(把依赖的对象放进服务容器统一管理)

  1. <?php
  2. namespace mvc_demo;
  3. require 'model.php';
  4. require 'view.php';
  5. // 服务容器
  6. class Container1
  7. {
  8. // 1.对象容器
  9. protected $instabces = [];
  10. // 2.向对象容器添加对象
  11. // 参数1:是外部对象的在对象容器中的键名/别名
  12. // 参数2:添加外部对象的实例化过程
  13. // closure:闭包(匿名函数)有命名空间存在所以要加上\
  14. public function bind($alias, \Closure $process)
  15. {
  16. $this->instabces[$alias] = $process;
  17. }
  18. // 3.调用对象
  19. public function make($alias, $params = [])
  20. {
  21. return call_user_func_array($this->instabces[$alias], $params);
  22. }
  23. }
  24. // 将外部对象绑定到服务容器
  25. $container = new Container1;
  26. // 添加模型类
  27. $container->bind('model', function () {
  28. return new Model();
  29. });
  30. // 添加视图类
  31. $container->bind('view', function () {
  32. return new view();
  33. });
  34. // 控制器
  35. class Cotroller3
  36. {
  37. public function index($container)
  38. {
  39. // 1.获取数据
  40. $date = $container->make('model')->get();
  41. // 2.渲染数据
  42. return $container->make('view')->fetch($date);
  43. }
  44. }
  45. echo (new Cotroller3)->index($container);

门面技术

  1. <?php
  2. namespace mvc_demo;
  3. require 'model.php';
  4. require 'view.php';
  5. // 服务容器(将控制器依赖过多的外部对象转为依赖服务容器的依赖)
  6. class Container1
  7. {
  8. // 1.对象容器
  9. protected $instabces = [];
  10. // 2.向对象容器添加对象
  11. // 参数1:是外部对象的在对象容器中的键名/别名
  12. // 参数2:添加外部对象的实例化过程
  13. // closure:闭包(匿名函数)有命名空间存在所以要加上\
  14. public function bind($alias, \Closure $process)
  15. {
  16. $this->instabces[$alias] = $process;
  17. }
  18. // 3.调用对象
  19. public function make($alias, $params = [])
  20. {
  21. return call_user_func_array($this->instabces[$alias], $params);
  22. }
  23. }
  24. // 将外部对象绑定到服务容器
  25. $container = new Container1;
  26. // 添加模型类
  27. $container->bind('model', function () {
  28. return new Model();
  29. });
  30. // 添加视图类
  31. $container->bind('view', function () {
  32. return new view();
  33. });
  34. // facade
  35. class facade
  36. {
  37. protected static $container;
  38. public static function initalize($container)
  39. {
  40. static::$container = $container;
  41. }
  42. }
  43. // 模型类套一个静态马甲用于调用
  44. class Userm extends facade
  45. {
  46. public static function get()
  47. {
  48. return static::$container->make('model')->get();
  49. }
  50. }
  51. // 视图类套一个静态马甲用于调用
  52. class Userv extends facade
  53. {
  54. public static function fetch($date)
  55. {
  56. return static::$container->make('view')->fetch($date);
  57. }
  58. }
  59. // 控制器
  60. class Cotroller3
  61. {
  62. // 构造方法生成服务容器
  63. public function __construct($container)
  64. {
  65. facade::initalize($container);
  66. }
  67. public function index()
  68. {
  69. // 1.获取数据
  70. $date = Userm::get();
  71. // 2.渲染数据
  72. return Userv::fetch($date);
  73. }
  74. }
  75. echo (new Cotroller3($container))->index();

总结

1.对于设计模式有了一定的理解了
2.对于服务容器中调用对象的函数(call_user_func_array)没有理解好其应用

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