博客列表 >12月4日-MVC框架基础-PHP培训线上九期班

12月4日-MVC框架基础-PHP培训线上九期班

邯郸易住宋至刚
邯郸易住宋至刚原创
2019年12月17日 22:45:46752浏览

一、课堂源代码全部写一遍,加上自己理解的注释

1、Demo1.php

代码

  1. <?php
  2. namespace _1204;
  3. use PDO;
  4. // static: 声明类中的静态成员
  5. // 1. 创建类
  6. class Db1
  7. {
  8. // 2. 添加类成员
  9. // 添加的静态成员: 属性, 方法
  10. // 静态属性
  11. //数据库连接对象
  12. protected static $pdo;
  13. //数据源
  14. protected static $dsn = 'mysql:host=127.0.0.1;dbname=mt';
  15. protected static $username = 'root';
  16. protected static $password = '111';
  17. // 静态方法
  18. //关键字static
  19. public static function connect()
  20. {
  21. // 在类中访问当前类的静态成员: self::
  22. self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
  23. }
  24. // 测试方法
  25. public static function select()
  26. {
  27. // 连接数据库
  28. //这是惰性连接,需要的时候连接
  29. self::connect();
  30. //直接调用了query()方法
  31. return self::$pdo->query('SELECT * FROM `user` LIMIT 5', PDO::FETCH_ASSOC);
  32. }
  33. }
  34. // 3. 访问类成员
  35. // 在类的外部,访问类中的静态成员, 直接用类名
  36. $result = Db1::select();
  37. //var_dump($result);
  38. foreach ($result as $row) {
  39. echo '<pre>' . print_r($row, true) . '</pre>';
  40. }

结果

2、Demo2.php

代码

  1. <?php
  2. namespace _1204;
  3. // static: 后期静态绑定
  4. // 使用场景 : 静态继承的上下文环境中
  5. // 类成员访问绑定时间: 在声明的时候绑定, 在调用的时候绑定
  6. // 后期绑定就是在类成员被调用的时候再动态的绑定, 也叫:延迟绑定
  7. use PDO;
  8. // static: 声明类中的静态成员
  9. // 1. 创建类
  10. class Db2
  11. {
  12. // 2. 添加类成员
  13. // 添加的静态成员: 属性, 方法
  14. // 静态属性
  15. protected static $pdo;
  16. protected static $dsn = 'mysql:host=127.0.0.1;dbname=mt';
  17. protected static $username = 'root';
  18. protected static $password = '112';
  19. // 静态方法
  20. public static function connect()
  21. {
  22. // 在类中访问当前类的静态成员: self::
  23. static::$pdo = new PDO(static::$dsn, static::$username, static::$password);
  24. }
  25. // 测试方法
  26. public static function select()
  27. {
  28. // 连接数据库
  29. static::connect();
  30. return self::$pdo->query('select * from `user` where uid>3' , PDO::FETCH_ASSOC);
  31. }
  32. }
  33. class Sub extends Db2
  34. {
  35. protected static $username = 'root';
  36. protected static $password = '111';
  37. public static function connect()
  38. {
  39. self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
  40. }
  41. }
  42. // 3. 访问类成员
  43. // 在类的外部,访问类中的静态成员, 直接用类名
  44. $result = Sub::select();
  45. //本意是想用子类中的connect();
  46. foreach ($result as $row) {
  47. echo '<pre>' . print_r($row, true) . '</pre>';
  48. }

结果

3、mvc\Demo1.php

代码

  1. <?php
  2. // 控制器: 将商品信息表展示出来
  3. namespace mvc;
  4. // 1. 加载模型
  5. require 'Model.php';
  6. // 2. 加载视图
  7. require 'View.php';
  8. // 3. 创建控制器
  9. class Controller1
  10. {
  11. public function index()
  12. {
  13. // 3.1 获取数据
  14. $model = new Model();
  15. $data = $model->getData();
  16. // 3.2 渲染模板
  17. $view = new View();
  18. return $view->fetch($data);
  19. }
  20. }
  21. // 4. 客户端调用/访问类成员
  22. $controller = new Controller1();
  23. echo $controller->index();

结果

4、mvc\Demo2.php

代码

  1. <?php
  2. // 控制器: 将商品信息表展示出来
  3. // 将类中对其它类的实例化, 模型/视图分离出来, 降低耦合度
  4. // 依赖注入
  5. namespace mvc;
  6. // 1. 加载模
  7. require 'Model.php';
  8. // 2. 加载视图
  9. require 'View.php';
  10. // 3. 创建控制器
  11. class Controller2
  12. {
  13. public function index(Model $model, View $view)
  14. {
  15. // 3.1 获取数据
  16. $data = $model->getData();
  17. // 3.2 渲染模板
  18. return $view->fetch($data);
  19. }
  20. }
  21. // 4. 客户端调用/访问类成员
  22. // 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
  23. $model = new Model();
  24. $view = new View();
  25. // 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  26. $controller = new Controller2();
  27. echo $controller->index($model, $view);

结果

5、mvc\Demo3.php

代码

  1. <?php
  2. // 控制器: 将商品信息表展示出来
  3. // 依赖注入: 将注入点改到了控制器的构造方法中
  4. namespace mvc;
  5. // 1. 加载模型
  6. require 'Model.php';
  7. // 2. 加载视图
  8. require 'View.php';
  9. // 3. 创建控制器
  10. class Controller3
  11. {
  12. protected $model;
  13. protected $view;
  14. // 构造方法, 注入点改到了构造方法中, 实现了模型与视图对象的共享
  15. public function __construct(Model $model, View $view)
  16. {
  17. $this->model = $model;
  18. $this->view = $view;
  19. }
  20. public function index()
  21. {
  22. // 3.1 获取数据
  23. $data = $this->model->getData();
  24. // 3.2 渲染模板
  25. return $this->view->fetch($data);
  26. }
  27. }
  28. // 4. 客户端调用/访问类成员
  29. // 将模型与视图的实例化代码从控制器分离出来, 放到了客户端
  30. $model = new Model();
  31. $view = new View();
  32. // 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  33. $controller = new Controller3($model, $view);
  34. echo $controller->index();

结果

6、mvc\Demo4.php

代码

  1. <?php
  2. // 控制器: 将商品信息表展示出来
  3. // 依赖注入: 将注入点改到了控制器的构造方法中
  4. namespace mvc;
  5. //引用Closure别名
  6. use Closure;
  7. // 1. 加载模型
  8. require 'Model.php';
  9. // 2. 加载视图
  10. require 'View.php';
  11. /**************************************************/
  12. //添加服务容器层
  13. class Container
  14. {
  15. // 容器属性, 就是一个数组,里面全是创建对象的方法
  16. protected $instance = [];
  17. // 1. 放进去: 将类的实例化过程绑定到容器中
  18. // $alias: 类实例的别名,
  19. public function bind($alias, Closure $process)
  20. {
  21. // 将类实例化的方法绑定/ 存储到服务容器中
  22. $this->instance[$alias] = $process;
  23. }
  24. // 2. 取出来: 执行容器中的实例方法
  25. public function make($alias, $params=[])
  26. {
  27. return call_user_func_array($this->instance[$alias], []);
  28. }
  29. }
  30. // 实例化容器
  31. $container = new Container();
  32. // 用到模型对象, 视图对象,将它们绑定到容器中
  33. $container->bind('model', function () {return new Model();});
  34. $container->bind('view', function () {return new View();});
  35. /**************************************************/
  36. // 3. 创建控制器
  37. class Controller4
  38. {
  39. public function index(Container $container)
  40. {
  41. // 3.1 获取数据
  42. $data = $container->make('model')->getData();
  43. // 3.2 渲染模板
  44. return $container->make('view')->fetch($data);
  45. }
  46. }
  47. // 4. 客户端调用/访问类成员
  48. // 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  49. $controller = new Controller4();
  50. echo $controller->index($container);

结果

二、将Demo5手抄提交

三、总结

1、MVC:是一种编程模式

Model:用来操作数据表,与一张具体的数据表绑定
View:渲染页面,形成视图
Controller:有两个最基本的功能:获取数据和渲染页面

2、依赖注入

将注入点放在构造函数中,解决了数据共享问题

3、服务层容器

解决了对类的依赖的中的耦合问题

Facade静态代理:

解决了在类外部对于类成员访问的规范,统一以静态方式访问,不管原来是什么方式。

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