博客列表 >12月4号作业 静态成员及初识MVC

12月4号作业 静态成员及初识MVC

遗忘了寂寞
遗忘了寂寞原创
2019年12月05日 17:31:26636浏览

static: 声明类中的静态成员

  1. <?php
  2. namespace zy1204;
  3. use PDO;
  4. // static: 声明类中的静态成员
  5. // 1. 创建类
  6. class Db1
  7. {
  8. // 2. 添加类成员
  9. // 添加的静态成员: 属性, 方法
  10. // 静态属性
  11. protected static $pdo;
  12. protected static $dsn = 'mysql:host=127.0.0.1;dbname=tj_ys';
  13. protected static $username = 'root';
  14. protected static $password = '123123';
  15. // 静态方法
  16. public static function connect()
  17. {
  18. // 在类中访问当前类的静态成员: self::
  19. self::$pdo = new PDO(self::$dsn, self::$username, self::$password);
  20. }
  21. // 测试方法
  22. public static function select()
  23. {
  24. // 连接数据库
  25. self::connect();
  26. return self::$pdo->query('select * from `user`', PDO::FETCH_ASSOC);
  27. }
  28. }
  29. // 3. 访问类成员
  30. // 在类的外部,访问类中的静态成员, 直接用类名
  31. $result = Db1::select();
  32. foreach ($result as $row) {
  33. echo '<pre>' . print_r($row, true) . '</pre>';
  34. }

static: 后期静态绑定

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

简单MVC

model.php

  1. <?php
  2. namespace mvc;
  3. // 模型类:用于数据表的操作
  4. class Model
  5. {
  6. public function getData()
  7. {
  8. // 用二维数组来模拟从表中获取到的商品数据
  9. return [
  10. ['id'=>1, 'name'=>'小米手机', 'model'=>'小米9', 'price'=>1999],
  11. ['id'=>2, 'name'=>'华为手机','model'=>'P30 Pro','price'=>4988],
  12. ['id'=>3, 'name'=>'小爱同学','model'=>'AI音箱','price'=>299],
  13. ];
  14. }
  15. }

view.php

  1. <?php
  2. namespace mvc;
  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></tr>';
  11. foreach ($data as $product) {
  12. $table .= '<tr>';
  13. $table .= '<td>' . $product['id'] . '</td>';
  14. $table .= '<td>' . $product['name'] . '</td>';
  15. $table .= '<td>' . $product['model'] . '</td>';
  16. $table .= '<td>' . $product['price'] . '</td>';
  17. $table .= '</tr>';
  18. }
  19. $table .= '</table>';
  20. return $table;
  21. }
  22. }
  23. echo '<style>
  24. table {border-collapse: collapse; border: 1px solid; width: 500px;height: 150px}
  25. caption {font-size: 1.2rem; margin-bottom: 10px;}
  26. tr:first-of-type { background-color:lightblue;}
  27. td,th {border: 1px solid}
  28. td:first-of-type {text-align: center}
  29. </style>';

控制器: 将商品信息表展示出来

  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();

依赖注入

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

依赖注入: 将注入点改到了控制器的构造方法中

  1. <?php
  2. // 依赖注入: 将注入点改到了控制器的构造方法中
  3. namespace mvc;
  4. // 1. 加载模型
  5. use BaconQrCode\Common\Mode;
  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();

添加服务容器层

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

Facade技术

  1. <?php
  2. // Facade技术: 规范/统一了对外部对象的调用方式, 全部改为了静态调用, 不管之前的方法是什么类型
  3. namespace mvc;
  4. // 1. 加载模型
  5. use BaconQrCode\Common\Mode;
  6. require 'Model.php';
  7. // 2. 加载视图
  8. require 'View.php';
  9. //添加服务容器层
  10. class Container1
  11. {
  12. // 容器属性, 就是一个数组,里面全是创建对象的方法
  13. protected $instance = [];
  14. // 1. 放进去: 将类的实例化过程绑定到容器中
  15. // $alias: 类实例的别名,
  16. public function bind($alias, \Closure $process)
  17. {
  18. // 将类实例化的方法绑定/ 存储到服务容器中
  19. $this->instance[$alias] = $process;
  20. }
  21. // 2. 取出来: 执行容器中的实例方法
  22. public function make($alias, $params=[])
  23. {
  24. return call_user_func_array($this->instance[$alias], []);
  25. }
  26. }
  27. // 实例化容器
  28. $container = new Container1();
  29. // 用到模型对象, 视图对象,将它们绑定到容器中
  30. $container->bind('model', function () {return new Model();});
  31. $container->bind('view', function () {return new View();});
  32. // 添加Facade门面类
  33. class Facade
  34. {
  35. protected static $container = null;
  36. protected static $data = [];
  37. // 用服务容器给它初始化
  38. public static function initialize(Container1 $container)
  39. {
  40. static::$container = $container;
  41. }
  42. // 用静态代理方式将模型中的getData()静态化
  43. public static function getData()
  44. {
  45. static::$data = static::$container->make('model')->getData();
  46. }
  47. // 用静态代理方式将视图中的fetch()静态化
  48. public static function fetch()
  49. {
  50. return static::$container->make('view')->fetch(static::$data);
  51. }
  52. }
  53. // 声明子类
  54. class St extends Facade
  55. {
  56. //
  57. }
  58. // 3. 创建控制器
  59. class Controller5
  60. {
  61. public function __construct(Container1 $container)
  62. {
  63. // 调用Faceda里面的初始化方法
  64. St::initialize($container);
  65. }
  66. public function index()
  67. {
  68. // 3.1 获取数据
  69. St::getData();
  70. // 3.2 渲染模板
  71. return St::fetch();
  72. }
  73. }
  74. // 4. 客户端调用/访问类成员
  75. // 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  76. $controller = new Controller5($container);
  77. echo $controller->index();





总结:

学习了如何用static: 声明类中的静态成员
了解了static: 后期静态绑定及使用场景
初步了解了mvc设计模式及设计思想

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