Blogger Information
Blog 48
fans 0
comment 0
visits 34364
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
简单演示MVC(0804)
丶久而旧之丶
Original
576 people have browsed it

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)没有理解好其应用

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:mvc不算设计模式,只是一个开发思想
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post