Blogger Information
Blog 16
fans 7
comment 1
visits 11525
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
12月04日- mvc模式
Eric
Original
802 people have browsed it

MVC 模式:Model-View-Controller(模型-视图-控制器)。

模型Model:模型代表业务逻辑的处理结果,如数据
视图View:代表用户的交互页面
控制器Controller:控制层是View层和Model层之间的一个桥梁,获取模型的处理结果,并渲染到页面

模型Model

  1. class Model
  2. {
  3. public function getData()
  4. {
  5. // 用二维数组来模拟从表中获取到的商品数据
  6. return [
  7. ['id'=>1, 'name'=>'苹果电脑', 'model'=>'MacBook Pro', 'price'=>25800],
  8. ['id'=>2, 'name'=>'华为手机','model'=>'P30 Pro','price'=>4988],
  9. ['id'=>3, 'name'=>'小爱同学','model'=>'AI音箱','price'=>299],
  10. ];
  11. }
  12. }

视图View

  1. class View
  2. {
  3. public function fetch($data)
  4. {
  5. $table = '';
  6. $table .= '<table>';
  7. $table .= '<caption>商品信息表</caption>';
  8. $table .= '<tr><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>';
  9. foreach ($data as $item){
  10. $table .= '<tr>';
  11. $table .= "<td>{$item['id']}</td>";
  12. $table .= "<td>{$item['name']}</td>";
  13. $table .= "<td>{$item['model']}</td>";
  14. $table .= "<td>{$item['price']}</td>";
  15. $table .= '</tr>';
  16. }
  17. $table .= '</table>';
  18. return $table;
  19. }
  20. }
  21. echo '<style>
  22. table {border-collapse: collapse; border: 1px solid; width: 500px;height: 150px}
  23. caption {font-size: 1.2rem; margin-bottom: 10px;}
  24. tr:first-of-type { background-color:lightblue;}
  25. td,th {border: 1px solid}
  26. td:first-of-type {text-align: center}
  27. </style>';

控制器Controller

  1. require 'Model.php';
  2. require 'View.php';
  3. // 1、服务容器
  4. class Container
  5. {
  6. //装载对象方法的容器
  7. protected $instance = [];
  8. /**
  9. * 将类的实例化过程绑定到容器中
  10. * @param $alias:类实例的别名
  11. * @param Closure $process 闭包类/匿名函数
  12. */
  13. public function bind($alias, Closure $process)
  14. {
  15. $this->instance[$alias] = $process;
  16. }
  17. /**
  18. * @param $alias 类实例别名
  19. * @param array $params 数组参数
  20. * @return mixed 实例/对象
  21. */
  22. public function make($alias, $params = [])
  23. {
  24. return call_user_func_array($this->instance[$alias], []);
  25. }
  26. }
  27. //实例化容器
  28. $container = new Container();
  29. //将模型对象、视图对象保存到容器中
  30. $container->bind('model', function () {
  31. return new Model();
  32. });
  33. $container->bind('view', function () {
  34. return new View();
  35. });
  36. // 2、添加Facade门面类, 规范/统一对外部对象的调用方式(静态)
  37. class Facade
  38. {
  39. protected static $container;
  40. protected static $data = [];
  41. /**
  42. * @param Container $container 服务容器
  43. */
  44. public static function initialize(Container $container)
  45. {
  46. static::$container = $container;
  47. }
  48. // 将模型中的 getData() 方法静态化
  49. public static function getData()
  50. {
  51. static::$data = static::$container->make('model')->getData();
  52. }
  53. // 将模型中的 fetch() 方法静态化
  54. public static function fetch()
  55. {
  56. return static::$container->make('view')->fetch(static::$data);
  57. }
  58. }
  59. // 3、创建控制器
  60. class Controller
  61. {
  62. public function __construct(Container $container)
  63. {
  64. // 调用 Facade里面的初始化方法
  65. Facade::initialize($container);
  66. }
  67. public function index()
  68. {
  69. // 获取数据
  70. Facade::getData();
  71. // 渲染模板
  72. return Facade::fetch();
  73. }
  74. }
  75. //客户端调用
  76. $controller = new Controller($container);
  77. echo $controller->index();

代码效果:

手写:


总结:
1、类的静态成员:使用static声明,内部访问使用self::属性名/方法名,类外访问使用类名::属性名/方法名

2、静态延迟绑定:使用static::属性名/方法名绑定,普通成员属性/方法在编译时被调用,静态成员属性/方法在运行时被调用。最终谁调用它,它就属于哪个类的成员。

3、mvc模式:使用mvc模式编程,极大的提高开发效率,降低耦合度。M代表模型,V代表视图,C代表控制器。
控制器通过使用容器(Container)分别将ModelView的实例放入到Container 中,再使用Facade类将Model中的getData()View中的fetch()方法静态化,然后在Controller控制器中分别使用Facade::getData()Facade::fetch()完成数据获取和模板的渲染。
最后客户端实例化控制器并调用index()方法。

THE END !

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:作业干净整齐, 在面向如此灾难(原作业被清空)之下, 仍能保持一颗平和的心态认真学习.不错的.... 之前的作业, 可以抽空再写上一遍,这是老天逼你成功, 逼你学习. 作业没有其实是好事, 不是吗?
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
1 comments
Eric 2019-12-05 14:39:44
朱老师,我会的,有空我会一篇一篇补上来的 ^_^
1 floor
Author's latest blog post