博客列表 >PHP - MVC

PHP - MVC

晴天
晴天原创
2020年05月14日 17:05:52628浏览

MVC 原理

  • mvc 是 modle view controller 的缩写;
缩写 全拼 描述 备注
M Model 模型 核心数据层,程序需要操作的数据放这里
V View 视图 提供给用户的操作页面
C Controller 控制器 根据用户从视图层的指令访问模型层,产生最终结果
  • 创建模型类 Model.php
    ```php
    <?php

namespace mvc_demo;

//模型类 :链接数据库

class Model
{
public function getData()
{
// 返回数据库的数据
return (new \PDO(‘mysql:host=localhost;dbname=php11.edu’,’php11.edu’,’php11.edu’))
->query(‘SELECT * FROM staffs LIMIT 15’)
->fetchAll(\PDO::FETCH_ASSOC);

  1. }

}

  1. - 创建是视图类 View.php
  2. ```php
  3. <?php
  4. namespace mvc_demo;
  5. //视图类
  6. class View{
  7. public function fetch($data){
  8. $table = '<table>';
  9. $table .= '<caption>员工信息表</caption>';
  10. $table .= '<tr><th>ID</th><th>姓名</th><th>性别</th><th>职务</th><th>手机号</th><th>入职时间</th></tr>';
  11. // 将数据循环遍历出来
  12. foreach ($data as $staff) {
  13. $table .= '<tr>';
  14. $table .= '<td>' . $staff['id'] . '</td>';
  15. $table .= '<td>' . $staff['name'] . '</td>';
  16. $table .= '<td>' . ($staff['sex'] ? '男' : '女') . '</td>';
  17. $table .= '<td>' . $staff['position'] . '</td>';
  18. $table .= '<td>' . $staff['mobile'] . '</td>';
  19. $table .= '<td>' . date('Y年m月d日', $staff['hiredate']) . '</td>';
  20. $table .= '</tr>';
  21. }
  22. $table .= '</table>';
  23. return $table;
  24. }
  25. }
  26. echo '<style>
  27. table {border-collapse: collapse; border: 1px solid;text-align: center; width: 500px;height: 150px;width: 600px;}
  28. caption {font-size: 1.2rem; margin-bottom: 10px;}
  29. tr:first-of-type { background-color:wheat;}
  30. td,th {border: 1px solid; padding:5px}
  31. </style>';
  • 创建控制器 Controller

方法1

  1. <?php
  2. namespace mvc_demo;
  3. //控制器1
  4. // 加载模型类,视图类
  5. require 'Model.php';
  6. require 'View.php';
  7. //创建控制
  8. class Controller
  9. {
  10. public function index(){
  11. // 获取数据
  12. //实例化模型跟视图类
  13. $model = new Model();
  14. $data = $model->getData();
  15. $view = new View();
  16. return $view->fetch($data);
  17. }
  18. }
  19. //实例化输出
  20. echo (new Controller())->index();
  21. //输出成功
  • 此方法 当前类中对其他类的实例化都在当前类完成,造成代码间的耦合性过高,过分依赖外部对象
  • 可以使用依赖注入的方式 解决当前问题

方法2

  1. <?php
  2. namespace mvc_demo;
  3. //控制器1
  4. // 加载模型类,视图类
  5. require 'Model.php';
  6. require 'View.php';
  7. //创建控制
  8. class Controller
  9. {
  10. private $model;
  11. private $view;
  12. // 依赖注入点使用构造方法 这样可以实现代码的共用 比如类中有多个方法
  13. public function __construct(Model $model, View $view)
  14. {
  15. $this->model = $model;
  16. $this->view = $view;
  17. }
  18. //方法1
  19. public function index(){
  20. // 获取数据
  21. $data = $this->model->getData();
  22. return $this->view->fetch($data);
  23. }
  24. // 方法2
  25. public function index1(){
  26. // 获取数据
  27. $data = $this->model->getData();
  28. return $this->view->fetch($data);
  29. }
  30. }
  31. //实例化输出
  32. $model = new Model();
  33. $view = new View();
  34. echo (new Controller($model,$view))->index();
  35. //输出成功
  • 我们这里创建的对象都是彼此独立的,可以考虑给这些对象创建一个管家 = ”服务容器“ = container
  • 进行统一的处理和实例化
  • 两个功能: 1 将对象绑定到容器中 bind 2 把对象从容器中取出来 make

    方法三

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

总结

mvc 实现将逻辑,数据,界面分离 使同一个程序有不同的表现形式,易于程序维护和修改

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