博客列表 >用mvc演示几种设计模式,实现一个简单查询展示数据

用mvc演示几种设计模式,实现一个简单查询展示数据

简行
简行原创
2020年08月11日 12:26:541095浏览

## 一.用mvc演示几种设计模式,实现一个简单查询展示数据

文档说明

序号 文件 注释
1 Connect.php 数据库链接
2 Model.php 模型类
3 View.php 视图类
4 Controller.php 依赖注入之方法参数形式注入
5 Controller2.php 依赖注入之实列化参数形式注入
6 Controller3.php 服务容器
7 Controller4.php Facade门面技术

1.Connect.php:数据库链接

  1. <?php
  2. namespace demo_MVC;
  3. //数据库参数
  4. class Connect{
  5. private $param =[
  6. 'DB_HOST'=>'localhost',
  7. 'DB_TYPE'=>'mysql',
  8. 'DB_NAME'=>'my_user',
  9. 'DB_PASSWORD'=>'root123',
  10. 'DB_USER'=>'root',
  11. 'DB_CHARSET'=>'utf8',
  12. 'DB_PORT'=>'3306'
  13. ];
  14. //连接数据
  15. public function link(){
  16. try{
  17. //连接数据款
  18. return $pdo = new \PDO("mysql:host=localhost;dbname=my_user;charset=utf8",$this->param['DB_USER'],$this->param['DB_PASSWORD']);
  19. } catch(\PDOException $e){
  20. //捕捉特定于数据库信息的PDOEXCEPTION 异常
  21. echo $e->getMessage();
  22. } catch(\Throwable $e){
  23. //捕捉拥有Throwable接口的错误或者其他异常
  24. echo $e->getMessage();
  25. }
  26. }
  27. }
  1. Model.php :模型类

    1. <?php
    2. namespace demo_MVC;
    3. //加载数据库连接
    4. require "./connect.php";
    5. class Model extends Connect
    6. {
    7. //查询数据
    8. public function getInfo(){
    9. $pdo = parent::link();
    10. $sql = "SELECT * FROM `mu_user` LIMIT ?";
    11. $limit =6;
    12. $stm = $pdo ->prepare($sql);
    13. $stm ->bindParam(1,$limit,\PDO::PARAM_INT);
    14. $stm ->execute();
    15. $result = $stm ->fetchAll();
    16. return $result;
    17. }
    18. }

    3.View.php:视图类

    1. <?php
    2. namespace demo_MVC;
    3. class View
    4. {
    5. public function rendering($result){
    6. $table ="<table>
    7. <caption>用户列表</caption>
    8. <tr>
    9. <td>ID</td>
    10. <td>名称</td>
    11. <td>电话</td>
    12. <td>操作</td>
    13. </tr>";
    14. foreach( $result as $list){
    15. $table .="<tr>
    16. <td>".$list['id']."</td>
    17. <td>".$list['username']."</td>
    18. <td>".$list['phone']."</td>
    19. <td>
    20. <button onclick='location.href='control.php?act=edit&id=".$list['id']."' >编辑</button>
    21. <button onclick='del(".$list['id'].")'>删除</button>
    22. </td>
    23. </tr>";
    24. }
    25. $table .="</table>";
    26. $rend =$table."<style>
    27. table{
    28. text-align: center;
    29. border:2px solid #222;
    30. border-collapse: collapse;
    31. margin: 0 auto;
    32. }
    33. tr:first-of-type{
    34. background-color:thistle;
    35. }
    36. td{
    37. padding: 10px;
    38. border:1px solid #000;
    39. }
    40. p{
    41. text-align: center;
    42. }
    43. a{
    44. text-align: center;
    45. border:1px solid #000;
    46. text-decoration: none;
    47. padding: 5px 10px;
    48. margin: 10px 2px;
    49. border-radius: 10%;
    50. }
    51. p>span{
    52. font-size: 1.5rem;
    53. margin: auto;
    54. padding: 10px;
    55. }
    56. .cla{
    57. background-color: lightskyblue;
    58. color: lightgoldenrodyellow;
    59. border: 1px solid lightskyblue;
    60. }
    61. </style>";
    62. return $rend;
    63. }
    64. }

4.Controller.php:依赖注入之方法参数形式注入;

作用:解决代码‘代码耦合度’问题

  1. <?php
  2. namespace demo_MVC;
  3. // 加载模型类
  4. require "Model.php";
  5. // 加载视图类
  6. require "View.php";
  7. //依赖注入之以控制器方法的参数形式注入
  8. class Controller
  9. {
  10. //展示数据
  11. public function list($model,$view){
  12. $result = $model ->getInfo();
  13. return $view->rendering($result);
  14. }
  15. }
  16. //实列模型类
  17. $model = new Model();
  18. //实列视图类
  19. $view = new View();
  20. //客户端调用
  21. echo (new Controller)->list($model,$view);

5.Controller2.php:依赖注入之实列化参数形式注入

作用:解决代码‘代码耦合度’问题,且实现外部对象的复用

  1. <?php
  2. namespace demo_MVC;
  3. require "Model.php";
  4. require "View.php";
  5. //依赖注入之以控实列化参数形式注入
  6. class Controller2
  7. {
  8. private $model;
  9. private $view;
  10. // 通过构造方法将外部对象初始化,实现了外部对象在当前类的共享/复用
  11. public function __construct($model,$view)
  12. {
  13. $this->model = $model;
  14. $this->view = $view;
  15. }
  16. // 获取数据,并展示出来
  17. public function list(){
  18. $result = $this->model ->getInfo();
  19. return $this->view->rendering($result);
  20. }
  21. }
  22. //实列模型类
  23. $model = new Model();
  24. //实列视图类
  25. $view = new View();
  26. $Controller = new Controller2($model,$view);
  27. echo $Controller->list();

6.Controller3.php:服务容器
总结:将外部对象的依赖,使用服务容器进行了接管,使当前类对许多外部对象的依赖, 转为对一个服务容器的依赖

  1. <?php
  2. namespace demo_MVC;
  3. use Closure;
  4. require "Model.php";
  5. require "View.php";
  6. //服务容器
  7. class contriner
  8. {
  9. // 1. 对象容器
  10. protected $obj =[];
  11. // 2. 向对象容器中添加对象
  12. // 参数1: 是外部对象在当前对象容器数组中的键名/别名
  13. // 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)
  14. public function bind($alias, Closure $proess){
  15. return $this->obj[$alias]= $proess;
  16. }
  17. //调用对象
  18. public function make($alias,$param=[]){
  19. //
  20. return call_user_func_array($this->obj[$alias],$param);
  21. }
  22. }
  23. //示例化容器
  24. $contriner = new contriner();
  25. //绑定模型类
  26. $contriner->bind('model',function(){
  27. return new Model();
  28. });
  29. //绑定视图类
  30. $contriner->bind('view',function(){
  31. return new View();
  32. });
  33. class Controller3
  34. {
  35. //把服务容器当作参数传入
  36. public function list(contriner $contriner){
  37. $result = $contriner->make('model') ->getInfo();
  38. return $contriner->make('view')->rendering($result);
  39. }
  40. }
  41. //客服端调用
  42. $Controller = new Controller3();
  43. echo $Controller->list($contriner);

7.Controller4.php:Facade门面技术,静态接管服务容器中的成员的访问、

  1. <?php
  2. namespace demo_MVC;
  3. use Closure;
  4. require "Model.php";
  5. require "View.php";
  6. // 服务容器
  7. class contriner1
  8. {
  9. // 1. 对象容器
  10. protected $obj =[];
  11. // 2. 向对象容器中添加对象
  12. // 参数1: 是外部对象在当前对象容器数组中的键名/别名
  13. // 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)
  14. public function bind($alias, Closure $proess){
  15. return $this->obj[$alias]= $proess;
  16. }
  17. //调用对象
  18. public function make($alias,$param=[]){
  19. return call_user_func_array($this->obj[$alias],$param);
  20. }
  21. }
  22. //实例化服务容器
  23. $contriner = new contriner1();
  24. //绑定模型类
  25. $contriner->bind('model',function(){
  26. return new Model();
  27. });
  28. //绑定视图类
  29. $contriner->bind('view',function(){
  30. return new View();
  31. });
  32. //Facade门面技术, 静态接管服务容器中的成员的访问
  33. class Facade
  34. {
  35. protected static $contriner = null;
  36. // 初始化方法: 就是给当前的Facade类扣$container属性赋值
  37. // 作用类似Facade的构造方法(但不是)
  38. // 将外部的服务容器注入到当前的facade中
  39. public static function initialize(contriner1 $contriner){
  40. static::$contriner = $contriner;
  41. }
  42. }
  43. //模型类成员访问静态化(给成员套一个静态访问的马甲)
  44. class ListMomdel extends Facade
  45. {
  46. public static function getInfo()
  47. {
  48. return static::$contriner->make('model')->getInfo();
  49. }
  50. }
  51. //视图类成员访问静态化(给成员套一个静态访问的马甲)
  52. class ListView extends Facade
  53. {
  54. public static function rendering($result)
  55. {
  56. return static::$contriner->make('view')->rendering($result);
  57. }
  58. }
  59. class Controller4
  60. {
  61. //初始化
  62. public function __construct(contriner1 $contriner)
  63. {
  64. Facade::initialize($contriner);
  65. }
  66. public function list(){
  67. $result = ListMomdel::getInfo();
  68. return ListView::rendering($result);
  69. }
  70. }
  71. // 客户端调用
  72. $Controller = new Controller4($contriner);
  73. echo $Controller->list();

二.总结

在类中经常实例化别的类,会造成代码耦合度过高;为解决这个问题,因而使用依赖注入;但如需要依赖注入外部对象很多,从而实例化很多外部对象,因此通过一个服务容器将外部对象统一示例化管理;而Facade门面技术进一步接管了对服务容器的访问,只需要对Facade进行调用访问

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