博客列表 >12月04日- mvc模式

12月04日- mvc模式

Eric
Eric原创
2019年12月05日 13:17:35794浏览

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 !

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
Eric2019-12-05 14:39:441楼
朱老师,我会的,有空我会一篇一篇补上来的 ^_^