一 . MVC架构模式

MVC概念:MVC包括控制器(Controller),模型(Model),视图(View)。


模型的作用 : 获取数据并处理返回数据


视图的作用 :将取得的数据进行渲染


控制器的作用 : 调用模型和 视图,将模型产生的数据传递给视图,并让视图去显示 ,控制器层(中间层) 是协调视图与模型的中间桥梁.

视图类

  1. <?php
  2. namespace view_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>
  11. <th>职务</th><th>手机号</th><th>入职时间</th></tr>';
  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{
  28. border-collapse:collapse;
  29. border:1px solid;
  30. text-align:center;
  31. width:500px;
  32. height:150px;
  33. }
  34. caption{
  35. font-size:1.2rem;
  36. margin-bottom:10px;
  37. }
  38. tr:first-of-type{
  39. background-color:wheat;
  40. }
  41. td.th{
  42. border:1px solid;
  43. padding:5px;
  44. }
  45. </style>';
  46. require 'Model.php';
  47. // class Model
  48. // {
  49. // public function getData()
  50. // {
  51. // return (new \PDO('mysql:host=localhost;dbname=16','root','root'))
  52. // ->query('SELECT * FROM `staffs`')
  53. // ->fetchAll(\PDO::FETCH_ASSOC);
  54. // }
  55. // }
  56. (new \mvc_demo\model)->getData();
  57. //echo (new View)->fetch();

模型类

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

操作器类

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

二.依赖注入 依赖注入为了防止当前类对外部了的过分依赖,而通过构造方法来实现自动注入;

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

三.对象容器 Container

对象容器可以理解为一个自动生产类的工厂

对象容器中有两个方法: bind方法和mark方法

bind方法就是将对象容器中添加一个实例

mark方法就是从容器中取出一个类实例(new)

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

四.门面技术 Facades

在 Laravel 应用中,Facade 就是一个可以从容器访问对象的类。其中核心的部件就是 Facade 类。

Facede门面技术:可以接管对容器中对象的访问,实现模型成员和视图成员的静态化

  1. <?php
  2. namespace mvc_demo;
  3. //加载模型类
  4. require 'Model.php';
  5. //加载视图类
  6. require 'View.php';
  7. //服务容器
  8. class Container2
  9. {
  10. //对象容器
  11. protected $instances = [];
  12. //bind:将对象容器中添加一个实例
  13. public function bind($alias,\Closure $process)
  14. {
  15. $this->instances[$alias] = $process;
  16. }
  17. //make:从容器中取出一个类实例(new)
  18. public function mark($alias,$params = [])
  19. {
  20. return call_user_func_array($this->instances[$alias],[]);
  21. }
  22. }
  23. $container = new Container2;
  24. $container->bind('model',function(){return new Model;});
  25. $container->bind('view',function(){return new View;});
  26. //Facede[]门面技术:可以接管对容器中对象的访问
  27. class Facede
  28. {
  29. //容器实例属性
  30. protected static $container = null;
  31. //初始化方法:从外部接收一个依赖对象:服务容器的实例
  32. public static function initialize(Container2 $container)
  33. {
  34. static::$container = $container;
  35. }
  36. }
  37. //模型成员静态化
  38. class Model extends Facede
  39. {
  40. protected static $data = [];
  41. public static function getData()
  42. {
  43. static::$data = static::$container->mark('model')->getData();
  44. }
  45. }
  46. //视图成员静态化
  47. class View extends Facede
  48. {
  49. protected static $data = [];
  50. public static function fetch()
  51. {
  52. static::$data = static::$container->mark('view')->fetch($data);
  53. }
  54. }
  55. //////////////////////////////////////////////////////////////////////////////////////
  56. //创建控制器
  57. class Controller5
  58. {
  59. //构造方法:调用门面的初始化方法
  60. public function __construct(Container2 $container)
  61. {
  62. Facede::initialize($container);
  63. }
  64. public function index(Container2 $container)
  65. {
  66. //1.获取数据
  67. $data = Model::getData();
  68. //2.渲染视图
  69. return View::fetch($data);
  70. }
  71. }
  72. //客户端
  73. //实例化控制类
  74. $controller = new Controller5($container);
  75. echo $controller->index($container);

更多相关文章

  1. 「Spring认证」Spring IoC 容器
  2. flex 容器和项目 常用属性
  3. 实例演示flex容器和项目属性设置
  4. 实例演示flex容器与项目中常用的属性
  5. flex容器以及属性
  6. flex容器与项目中常用的属性
  7. flex布局中容器及项目常用属性演示
  8. flex容器与项目的认识和常用属性
  9. flex容器

随机推荐

  1. Android的一些基本概念
  2. Android主流三方库源码分析(五、深入理解R
  3. Android常用类库包介绍
  4. Android 内核剖析
  5. Android之Shape和state_enabled使用总结
  6. Android Push Notification实现信息推送
  7. textview中有很多行,我只让它显示三行,最后
  8. Android 电话博大流程源码分析
  9. 基于OpenCV和QT,建立Android图像处理程序
  10. Android ART运行时与Dalvik虚拟机