Blogger Information
Blog 32
fans 1
comment 0
visits 23133
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1204作业MVC与框架基础PHP培训第九期线上班
淡月
Original
1558 people have browsed it

1.类静态成员

  1. <?php
  2. namespace _1204;
  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=mydb';
  13. protected static $username = 'peter';
  14. protected static $password = '123456';
  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 `users`', 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. }

2.后期静态绑定

  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=mydb';
  17. protected static $username = 'peter';
  18. protected static $password = '123456';
  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 `users`', PDO::FETCH_ASSOC);
  31. }
  32. }
  33. class Sub extends Db2
  34. {
  35. protected static $username = 'peter';
  36. protected static $password = '123456';
  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.MODEL 模型类

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

4.view视图

  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>';

5

5.Controller控制器

demo1

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

demo2

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

demo3

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

demo4

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

demo5

  1. <?php
  2. // 控制器: 将商品信息表展示出来
  3. // Facade技术: 规范/统一了对外部对象的调用方式, 全部改为了静态调用, 不管之前的方法是什么类型
  4. // laravel, thinkphp
  5. namespace mvc;
  6. // 1. 加载模型
  7. use BaconQrCode\Common\Mode;
  8. require 'Model.php';
  9. // 2. 加载视图
  10. require 'View.php';
  11. /**************************************************/
  12. //添加服务容器层
  13. class Container1
  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 Container1();
  32. // 用到模型对象, 视图对象,将它们绑定到容器中
  33. $container->bind('model', function () {return new Model();});
  34. $container->bind('view', function () {return new View();});
  35. /**************************************************/
  36. // 添加Facade门面类
  37. class Facade
  38. {
  39. protected static $container = null;
  40. protected static $data = [];
  41. // 用服务容器给它初始化
  42. public static function initialize(Container1 $container)
  43. {
  44. static::$container = $container;
  45. }
  46. // 用静态代理方式将模型中的getData()静态化
  47. public static function getData()
  48. {
  49. static::$data = static::$container->make('model')->getData();
  50. }
  51. // 用静态代理方式将视图中的fetch()静态化
  52. public static function fetch()
  53. {
  54. return static::$container->make('view')->fetch(static::$data);
  55. }
  56. }
  57. // 声明一学生类
  58. class Student extends Facade
  59. {
  60. //
  61. }
  62. /**************************************************/
  63. // 3. 创建控制器
  64. class Controller5
  65. {
  66. public function __construct(Container1 $container)
  67. {
  68. // 调用Faceda里面的初始化方法
  69. Student::initialize($container);
  70. }
  71. public function index()
  72. {
  73. // 3.1 获取数据
  74. Student::getData();
  75. // 3.2 渲染模板
  76. return Student::fetch();
  77. }
  78. }
  79. // 4. 客户端调用/访问类成员
  80. // 将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  81. $controller = new Controller5($container);
  82. echo $controller->index();

手抄作业




总结

学习了如何使用static:声明类中的静态成员
初步了解了MVC结构与框架基础
M:model,模型,类用于数据表的操作
V:view,视图类:渲染数据
C:Controller,控制器:将商品信息表展示出来

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:先写出最基本的功能 , 然后慢慢填充, 就像是小时候写作文, 先写一个大纲
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post