博客列表 >PHP 第课 :手写Demo5.php 12月4日

PHP 第课 :手写Demo5.php 12月4日

孤忆寻昔R
孤忆寻昔R原创
2019年12月15日 22:38:13812浏览

作业一

Demo1.php 认识静态static

  1. <?php
  2. namespace _1204; //认识静态static
  3. //static : 声明类中的静态成员
  4. /*class Db1
  5. {
  6. // 非静态成员: 必须实例化后才能访问
  7. // public function demo()
  8. // {
  9. //
  10. // }
  11. //
  12. }*/
  13. //1、创建类
  14. use PDO;
  15. class Db1
  16. {
  17. //2、添加类成员
  18. // 添加的静态成员: 属性, 方法
  19. protected static $pdo;
  20. protected static $dsn = 'mysql:host=127.0.0.1;dbname=pdo';
  21. protected static $username = 'root';
  22. protected static $password = 'root';
  23. //静态方法
  24. public static function connect()
  25. {
  26. //在类中访问当前类的静态成员
  27. self::$pdo = new PDO(self::$dsn,self::$username,self::$password);
  28. }
  29. //使用静态方法
  30. public static function select()
  31. {
  32. self::connect();
  33. return self::$pdo->query('select * from `users`',PDO::FETCH_ASSOC);
  34. }
  35. }
  36. //3、访问类成员 静态调用不同实例化
  37. $result = Db1::select();
  38. foreach($result as $row){
  39. echo '<pre>'.print_r($row,true).'</pre>';
  40. }

Demo2.php 静态调用

  1. <?php
  2. namespace _1204;
  3. //static: 后期静态绑定 延迟绑定
  4. //使用场景: 静态继承的上下文环境中
  5. //类成员访问绑定时间: 在声明的时候绑定,在调用的时候绑定
  6. //后期绑定就是在类成员被调用的时候在动态绑定,也叫: 延迟绑定
  7. use PDO;
  8. class Db2
  9. {
  10. // 1、添加静态成员
  11. protected static $pdo;
  12. protected static $dsn='mysql:host=127.0.0.1;dbname=pdo';
  13. protected static $username = 'root';
  14. protected static $password = 'root';
  15. public static function connect()
  16. {
  17. // 在类中访当前问静态成员: self::
  18. self:: $pdo = new PDO(self::$dsn,self::$username,self::$password);
  19. }
  20. public static function select()
  21. {
  22. // 1、在子类中使用父类方法需要将self换成 static
  23. static::connect();
  24. return self::$pdo->query('select * from `users`',PDO::FETCH_ASSOC);
  25. }
  26. }
  27. //继承Db2父类
  28. class Sub extends Db2
  29. {
  30. protected static $username = 'root';
  31. protected static $password = 'root';
  32. // 使用子类自定义的connect方法
  33. public static function connect()
  34. {
  35. self::$pdo = new PDO(self::$dsn,self::$password,self::$username);
  36. }
  37. }
  38. //访问类成员
  39. //$result = Db2::select();
  40. $result = Sub::select();
  41. //实际使用子类中conncet
  42. foreach($result as $wor)
  43. {
  44. echo '<pre>'.print_r($wor,true).'</pre>';
  45. }

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'=>'MackBook Pro', 'price'=>25800],
  11. ['id'=>2, 'name'=>'华为手机', 'model'=>'MackBook Pro', 'price'=>4988],
  12. ['id'=>3, 'name'=>'小爱同学', 'model'=>'AI音箱', 'price'=>399],
  13. ];
  14. }
  15. }

View.php 定义视图模板

  1. <?php
  2. namespace mvc;
  3. //视图类: 渲染数据
  4. class View
  5. {
  6. // 创建视图模板方法
  7. public function fetch($data)
  8. {
  9. $table = '<table>';
  10. $table .= '<caption>商品信息表</caption>';
  11. $table .= '<tr><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>';
  12. // 循环数据表
  13. foreach($data as $product)
  14. {
  15. $table .= '<tr>';
  16. $table .= '<td>'.$product['id'].'</td>';
  17. $table .= '<td>'.$product['name'].'</td>';
  18. $table .= '<td>'.$product['model'].'</td>';
  19. $table .= '<td>'.$product['price'].'</td>';
  20. $table .= '</tr>';
  21. }
  22. $table .= '</table>';
  23. return $table;
  24. }
  25. }
  26. //给表增加样式
  27. echo '<style>
  28. table {border-collapse: collapse;border: 1px solid; width: 500px;height: 150px}
  29. caption {font-size: 1.2rem; margin-bottom: 10px;}
  30. tr:first-of-type{background-color:lightblue;}
  31. td,th {border: 1px solid}
  32. td:first-of-type {text-align:center}
  33. </style>';
  34. //echo '<style>
  35. //table {border-collapse: collapse; border: 1px solid; width: 500px;height: 150px}
  36. //caption {font-size: 1.2rem; margin-bottom: 10px;}*/
  37. //tr:first-of-type { background-color:lightblue;}
  38. //td,th {border: 1px solid}
  39. //td:first-of-type {text-align: center}
  40. //</style>';

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

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) //index方法要依赖于模型对象和视图对象 怎么办?通过参数方式传入
  14. {
  15. //在控制器中不不应该对模型和视图进行实例化 怎么办? 拿到类的外面去
  16. // 3.1 获取数据
  17. // $model =new Model();
  18. $data = $model->getData();
  19. // 3.2 渲染模板
  20. // $view = new View();
  21. return $view->fetch($data);
  22. }
  23. }
  24. //4、客户端调用 : 访问类成员
  25. //将模型与视图的实例化代码从控制器中分离出来, 放到了客户端
  26. $model = new Model();
  27. $view = new View();
  28. //将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  29. $controller = new Controller2();
  30. echo $controller->index($model,$view); //'解决的耦合度

Demo3.php
<?php

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

Demo4.php

  1. <?php
  2. //控制器: 将商品信息表展示出来
  3. //依赖注入: 将注入点改到了控制器的构造方法中
  4. namespace mvc;
  5. //1、加载模型 需要使用use 模型
  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. // $this->instance['model'] = 'new Model()';
  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. //$container->bind('view', function () {return View();});
  36. /*******************************************************************/
  37. //3、创建控制器
  38. class Controller4
  39. {
  40. public function index(Container $container ) //index方法要依赖于模型对象和视图对象 怎么办?通过参数方式传入
  41. {
  42. //在控制器中不不应该对模型和视图进行实例化 怎么办? 拿到类的外面去
  43. // 3.1 获取数据
  44. // $model =new Model();
  45. $data = $container->make('model')->getData();
  46. // 3.2 渲染模板
  47. // $view = new View();
  48. return $container->make('view')->fetch($data);
  49. }
  50. }
  51. //4、客户端调用 : 访问类成员
  52. //将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  53. $controller = new Controller4();
  54. echo $controller->index($container); //'解决的耦合度

Facade.php 门面模式 包含了依赖依赖注入和嵌套容器

  1. <?php
  2. //控制器: 将商品信息表展示出来
  3. //依赖注入: 将注入点改到了控制器的构造方法中
  4. //Facdae技术: 规范/统一了对外部对象的调用方式,全部改为了静态调用,不管之前的方法是什么类型
  5. namespace mvc;
  6. //1、加载模型 使用use 完成操作
  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. // $this->instance['model'] = 'new Model()';
  24. }
  25. // 2、取出来: 执行容器中的实例方法
  26. public function make($alias,$params=[])
  27. {
  28. return call_user_func_array($this->instance[$alias],[]);
  29. }
  30. }
  31. /******************************************************/
  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 Student extends Facade
  55. {
  56. // 增删改查都可以用静态方法
  57. // 这样就能直接用子类调用
  58. }
  59. /******************************************************/
  60. //实例容器
  61. $container1 =new Container1();
  62. //用到模型对象,视图对象,将他们绑定到容器中
  63. $container1->bind('model',function(){return new Model();});
  64. $container1->bind('view',function(){return new View();});
  65. //$container->bind('view', function () {return View();});
  66. /*******************************************************************/
  67. //3、创建控制器
  68. class Controller5
  69. {
  70. public function __construct(Container1 $container)
  71. {
  72. //调用Facade里面的初始化方法
  73. Facade::initialize($container);
  74. }
  75. public function index() //index方法要依赖于模型对象和视图对象 怎么办?通过参数方式传入
  76. {
  77. //在控制器中不不应该对模型和视图进行实例化 怎么办? 拿到类的外面去
  78. // 3.1 获取数据
  79. // $model =new Model();
  80. Student::getData();
  81. // 3.2 渲染模板
  82. // $view = new View();
  83. return Student::fetch();
  84. }
  85. }
  86. //4、客户端调用 : 访问类成员
  87. //将模型对象与视图对象,以参数的方式再次注入到控制器的方法
  88. $controller = new Controller5($container1);
  89. echo $controller->index(); //'解决的耦合度

作业二


总结

1、static静态调用访问成员,不用实例化!使用self 不能使用$this,成员也是static

2、模型用来设置操作数据表的,将模型和视图放在同命名空间下,不能使用同样的类

3、创建容器后可以不用在类中,实例化模型和和视图,维护更放心,代码优化

4、Facade门面 使用将常用的操作方法封装成静态,然后用子类调用

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