Blogger Information
Blog 26
fans 1
comment 0
visits 22358
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 第课 :手写Demo5.php 12月4日
孤忆寻昔R
Original
815 people have browsed it

作业一

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门面 使用将常用的操作方法封装成静态,然后用子类调用

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