博主信息
博文 119
粉丝 3
评论 1
访问量 121279
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
MVC框架(依赖注入、对象容器)
赵大叔
原创
770人浏览过

MVC框架

  • Model:模型类,数据库操作
  • View:视图类,展示到客户端
  • Controller:控制器
  • 依赖注入:在客户端实例化类,把对象当做参数注入调用方法
  • 容器:对象容器,对象管家

Model代码:

  1. <?php
  2. namespace mvc_demo;
  3. // Model 模型类: 用于数据库操作
  4. class Model
  5. {
  6. public function getData()
  7. {
  8. return (new \PDO('mysql:host=localhost;dbname=phpedu', 'root','root'))
  9. ->query('SELECT * FROM `salary` LIMIT 15')
  10. ->fetchAll(\PDO::FETCH_ASSOC);
  11. }
  12. }

View代码:

  1. <?php
  2. namespace mvc_demo;
  3. // 视图类
  4. class View
  5. {
  6. public function fetch($data)
  7. {
  8. $table = '<table>';
  9. $table .= '<caption>员工工资明细</caption>';
  10. $table .= '<tr><th>ID</th><th>工号</th><th>姓名</th><th>入职日期</th><th>部门</th><th>岗位</th><th>工作天</th><th>应发</th></tr>';
  11. // 将数据循环遍历出来
  12. foreach ($data as $salary) {
  13. $table .= '<tr>';
  14. $table .= '<td>' . $salary['id'] .'</td>';
  15. $table .= '<td>' . $salary['msnv'] .'</td>';
  16. $table .= '<td>' . $salary['name'] .'</td>';
  17. $table .= '<td>' . date('Y-m-d', $salary['hiredate']) . '</td>';
  18. $table .= '<td>' . $salary['donvi'] . '</td>';
  19. $table .= '<td>' . $salary['congviec'] . '</td>';
  20. $table .= '<td>' . $salary['ngaycong'] . '</td>';
  21. $table .= '<td>' . $salary['salary'] . '</td>';
  22. $table .= '</tr>';
  23. }
  24. $table .= '</table>';
  25. return $table;
  26. }
  27. }
  28. echo '<style>
  29. table {border-collapse: collapse; border: 1px solid;text-align: center; margin: auto;}
  30. caption {font-size: 1.2rem; margin-bottom: 10px;}
  31. tr:first-of-type { background-color:wheat;}
  32. td,th {border: 1px solid; padding:5px}
  33. </style>';

控制器一(普通注入):

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器2
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 创建控制
  9. class Controller2
  10. {
  11. public function index(Model $model, View $view)
  12. {
  13. // 1. 获取数据
  14. $data = $model->getData();
  15. // 2. 渲染模板/视图
  16. return $view->fetch($data);
  17. }
  18. }
  19. // 客户端:
  20. $model = new Model;
  21. $view = new View;
  22. // 实例化控制器类
  23. $controller = new Controller2;
  24. echo $controller->index($model, $view);

控制器二(构造方法注入):

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器3
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 创建控制
  9. class Controller3
  10. {
  11. // 依赖对象属性: 对象参数
  12. private $model;
  13. private $view;
  14. public function __construct(Model $model, View $view)
  15. {
  16. $this->model = $model;
  17. $this->view = $view;
  18. }
  19. public function index()
  20. {
  21. // 1. 获取数据
  22. $data = $this->model->getData();
  23. // 2. 渲染模板/视图
  24. return $this->view->fetch($data);
  25. }
  26. public function index1()
  27. {
  28. // 1. 获取数据
  29. $data = $this->model->getData();
  30. // 2. 渲染模板/视图
  31. return $this->view->fetch($data);
  32. }
  33. }
  34. // 客户端:
  35. $model = new Model;
  36. $view = new View;
  37. // 实例化控制器类
  38. $controller = new Controller3($model, $view);
  39. echo $controller->index1();

控制器三(对象容器):

  1. <?php
  2. namespace mvc_demo;
  3. // 控制器4
  4. // 1. 加载模型类
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 服务容器
  9. class Container1
  10. {
  11. // 对象容器
  12. protected $instances = [];
  13. // 绑定: 向对象容器中添加一个类实例
  14. public function bind($alias, \Closure $process)
  15. {
  16. $this->instances[$alias] = $process;
  17. }
  18. // 取出: 从容器中取出一个类实例 (new)
  19. public function make($alias, $params = [])
  20. {
  21. return call_user_func_array($this->instances[$alias], []);
  22. }
  23. }
  24. $container = new Container1;
  25. // 绑定
  26. $container->bind('model', function () {return new Model;});
  27. $container->bind('view', function () {return new View;});
  28. // 4. 创建控制
  29. class Controller4
  30. {
  31. public function index(Container1 $container)
  32. {
  33. // 1. 获取数据
  34. $data = $container->make('model')->getData();
  35. // 2. 渲染模板/视图
  36. return $container->make('view')->fetch($data);
  37. }
  38. }
  39. // 客户端:
  40. // 实例化控制器类
  41. $controller = new Controller4();
  42. echo $controller->index($container);

感觉越来越抽象,对象容器知识还有点模糊,还要再多看几遍。
批改老师:天蓬老师天蓬老师

批改状态:合格

老师批语:框架本身就非常的抽象, 都是对具体业务的封装, 这些设计模式是开发者必须了解的理论基础, 有必要搞明白..., 我也见过对这些不知道的一样写代码, 但他想提升就非常困难了, 现在不要欠帐, 否则将来会加倍还
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学