博客列表 >PHP 第课 将课堂代码全部上机操作至少一遍以上 12月5日作业

PHP 第课 将课堂代码全部上机操作至少一遍以上 12月5日作业

孤忆寻昔R
孤忆寻昔R原创
2019年12月17日 22:33:301198浏览

作业一

Demo1.php单利模式
` <?php

  1. //单例模式
  2. namespace _1205;
  3. class Temp
  4. {
  5. //
  6. }
  7. $obj1 = new Temp();
  8. $obj2 = new Temp();
  9. var_dump($obj1,$obj2);
  10. //单例模式原理
  11. class Demo1
  12. {
  13. //构造方发私有化
  14. private function __construct()
  15. {
  16. }
  17. // 目前 只能在类中的背部将类实例化
  18. // 当前类的实例
  19. public static $instace = null;
  20. //实例化当前类的方法
  21. public static function getInstance()
  22. {
  23. //实例化当前类,并返回类实例/对象
  24. // 判断当前类是否已经被实例化过了,如果没有的化就实例化,如果以实例化,就返回它
  25. if(is_null(self::$instace)){
  26. self::$instace = new self;
  27. }
  28. return self::$instace;
  29. }
  30. // 禁用克隆魔术方法
  31. private function __clone()
  32. {
  33. }
  34. }
  35. //new Demo1();
  36. $obj1 = Demo1::getInstance();
  37. $obj2 = Demo1::getInstance();
  38. var_dump($obj1 === $obj2);
  39. echo '<hr>';
  40. var_dump($obj1,$obj2);//解决重复实例化
  41. //单利模型应用场景
  42. class Db
  43. {
  44. //构造方发私有化
  45. private function __construct(...$connectParams)
  46. {
  47. $dsn = $connectParams[0];
  48. $username = $connectParams[1];
  49. $password = $connectParams[2];
  50. self::$pdo = new \PDO($dsn,$username,$password);
  51. }
  52. // 目前 只能在类中的背部将类实例化
  53. // 当前类的实例
  54. public static $pdo = null;
  55. //实例化当前类的方法
  56. public static function getInstance(...$connectParams)
  57. {
  58. //实例化当前类,并返回类实例/对象
  59. // 判断当前类是否已经被实例化过了,如果没有的化就实例化,如果以实例化,就返回它
  60. if(is_null(self::$pdo)){
  61. // 构造函数不需要返回
  62. new self(...$connectParams);
  63. }
  64. return self::$pdo;
  65. }
  66. // 禁用克隆魔术方法
  67. private function __clone()
  68. {
  69. }
  70. }
  71. echo '<hr>';
  72. //连接数据库
  73. $connectParams = ['mysql:host=127.0.0.1;dbname=pdo','root','root'];
  74. $pdo = Db::getInstance(...$connectParams); //使用php7 新特性
  75. //使用查询数据库select
  76. print_r($pdo ->query('SELECT * FROM `users`')->fetchAll());`

Demo2.php 工厂模式
<?php

  1. namespace _1205;
  2. //工厂模式: 用于批量创建类的实例/ 对象
  3. use _1204\Db2;
  4. class Demo2
  5. {
  6. //....
  7. }
  8. //file1.php
  9. $obj = new Demo2();
  10. //file3.php
  11. $obj = new Demo2();
  12. //file3.php
  13. $obj = new Demo2();
  14. //+++++++++++++++++++++++++++++++++++++++++++
  15. //创建类
  16. class Test1
  17. {
  18. // 创建构造方法
  19. public function __construct($agr1)
  20. {
  21. echo '对象创建成功,参数是: ' . $agr1;
  22. }
  23. }
  24. //创建类
  25. class Test2
  26. {
  27. // 创建方法
  28. public function __construct($agr1,$arg2)
  29. {
  30. echo '对象创建成功,参数是: ' . implode(',',[$agr1,$arg2]);
  31. }
  32. }
  33. class Test3
  34. {
  35. public function __construct($agr1,$arg2,$agr3)
  36. {
  37. echo '对象创建成功,参数是: ' . implode(',',[$agr1,$arg2,$agr3]);
  38. }
  39. }
  40. //工厂类,专门创建类实例
  41. class Factory
  42. {
  43. public static function cerate($className,...$argments)
  44. {
  45. return new $className(...$argments);
  46. }
  47. }
  48. echo Test::class;//_1205\Test: 完整的类名,代用命名空间的
  49. //用工厂类来创建类实例
  50. Factory::cerate(Test1::class,100);
  51. echo '<br>';
  52. Factory::cerate(Test2::class,.100,200);
  53. echo '<br>';
  54. Factory::cerate(Test3::class,.100,200,300);

Demo3.php依赖注入
<?php
//依赖注入: 解决对象调用之间耦合

  1. //工作类
  2. class Person
  3. {
  4. // 要依赖的外部对象
  5. private $car = null;
  6. //在构造方法中将依赖的外部对象全部实例化
  7. // 注入点放到构造方法中
  8. public function __construct()
  9. {
  10. $this->car = new Car();
  11. }
  12. //对外部对象执行一个动作
  13. public function work()
  14. {
  15. return $this->car->drive();
  16. }
  17. }
  18. //依赖的外部类
  19. class Car
  20. {
  21. public function drive()
  22. {
  23. return '开车去上班';
  24. }
  25. }
  26. //实例化类
  27. $person = new Person();
  28. echo $person->work();
  29. echo '<hr>';
  30. /*********************************************/
  31. class Person1
  32. {
  33. // 要依赖的外部对象
  34. private $car = null;
  35. //在构造方法中将依赖的外部对象全部实例化
  36. // 注入点放到构造方法中
  37. public function __construct(Car $car)
  38. {
  39. $this->car = $car;
  40. }
  41. //对外部对象执行一个动作
  42. public function work()
  43. {
  44. return $this->car->drive();
  45. }
  46. }
  47. //依赖的外部类
  48. class Car1
  49. {
  50. public function drive()
  51. {
  52. return '开车去上班';
  53. }
  54. }
  55. //实例化类
  56. $car = new Car();
  57. $person = new Person1($car);
  58. echo $person->work();
  59. echo '<hr>';

base\Travel1.php
<?php
//旅行类: 使用最传统的方式

  1. namespace base;
  2. //设置引用的外部类名的别名
  3. use base\inc1\Car;
  4. use base\inc1\Train;
  5. use base\inc1\Plane;
  6. //导入绝对的路径自动加载
  7. require __DIR__.'/autoload.php';
  8. //创建类
  9. class Travel1
  10. {
  11. //交通工具
  12. private $vehicle;
  13. //构造方法
  14. public function __construct($vehicle)
  15. {
  16. // 用switch判断下条件 用构造方法进行初始化
  17. switch(strtolower($vehicle)){
  18. case 'car':
  19. $this->vehicle = new Car(); //初始化成员后 = 实例化Car()方法
  20. break;
  21. case 'train':
  22. $this->vehicle = new Train();
  23. break;
  24. case 'plane':
  25. $this->vehicle = new Plane();
  26. }
  27. }
  28. // 创建去哪里玩耍模型控制器
  29. public function travelModel()
  30. {
  31. // 返回本类中 构造初始化 -》 inc1中的三个方法
  32. return $this->vehicle->drive(). ': 去旅行';
  33. }
  34. }
  35. //客户端调用 实例化car方法 -》抵用 travaelMidel 模板信息
  36. echo (new Travel1('car'))->travelModel(), '</br>';
  37. echo (new Travel1('train'))->travelModel(),'</br>';
  38. echo (new Travel1('plane'))->travelModel().'<br>';

base\Travel2.php
<?php
//旅行类: 使用最传统的方式

  1. namespace base;
  2. //设置引用的外部类名的别名
  3. use base\inc1\Car;
  4. use base\inc1\Train;
  5. use base\inc1\Plane;
  6. //导入绝对的路径自动加载
  7. require __DIR__.'/autoload.php';
  8. //工厂类 : 专用于创建类实例
  9. class Factory
  10. {
  11. // 将工厂类成员静态化
  12. protected static $instance = null;
  13. public static function getInstance($vehicle)
  14. {
  15. switch(strtolower($vehicle)){
  16. case 'car':
  17. self::$instance = new Car();
  18. break;
  19. case 'train':
  20. static::$instance = new Train();
  21. break;
  22. case 'plane':
  23. static::$instance = new Plane();
  24. }
  25. //返回当前具体的交通工具
  26. return static::$instance;
  27. }
  28. }
  29. //1、创建类
  30. class Travel2
  31. {
  32. //交通工具
  33. private $vehicle;
  34. //构造方法
  35. public function __construct($vehicle)
  36. {
  37. // 用构造方法进行初始化
  38. $this->vehicle = Factory::getInstance($vehicle);
  39. }
  40. // 创建去哪里玩耍模型控制器
  41. public function travelModel()
  42. {
  43. // 返回 本类调用初始化 -》调用是三个值
  44. return $this->vehicle->drive(). ': @@@@去旅行';
  45. }
  46. }
  47. //客户端调用 实例化car方法 -》抵用 travaelMidel 模板信息
  48. echo (new Travel2('car'))->travelModel(), '</br>';
  49. echo (new Travel2('train'))->travelModel(),'</br>';
  50. echo (new Travel2('plane'))->travelModel().'<br>';

base\Travel3.php
<?php
//旅行类: 使用最传统的方式

  1. namespace base;
  2. //设置引用的外部类名的别名
  3. use base\inc2\Car;
  4. use base\inc2\Train;
  5. use base\inc2\Plane;
  6. use base\inc2\Ship;
  7. use base\inc2\iVehicle; // 使用类
  8. //调用绝对路径自动加载
  9. require __DIR__.'/autoload.php';
  10. //创建类
  11. class Travel3
  12. {
  13. //交通工具
  14. private $vehicle;
  15. //构造方法 : 使用了接口给对象类 变得更加的灵活
  16. public function __construct(iVehicle $vehicle)
  17. {
  18. // 初始化交通工具
  19. $this->vehicle = $vehicle;
  20. }
  21. // 创建类方法 去哪里玩耍
  22. public function travelModel()
  23. {
  24. // 返回 调用本类的构造方法 然后调用接口中的统一方法 function drive()
  25. return $this->vehicle->drive(). ': ++++++++++++++去旅行';
  26. }
  27. }
  28. //客户端调用 接口实现了统一方法,让代码更加简洁
  29. echo (new Travel3(new Car()))->travelModel(), '</br>';
  30. echo (new Travel3(new Train()))->travelModel(),'</br>';
  31. echo (new Travel3(new Plane()))->travelModel().'<br>';
  32. echo (new Travel3(new Ship()))->travelModel().'<br>';

1205/lesson1/Container.php
<?php

  1. //容器类
  2. namespace _1205;
  3. use Closure;
  4. //创建容器类
  5. class Container
  6. {
  7. //类实例容器
  8. protected $instance = [];
  9. //将类实例化的过程绑定到容器中
  10. public function bind($alias,Closure $process)
  11. {
  12. $this->instance[$alias] = $process;
  13. }
  14. // 去除保存在容器中的实例化过程的闭包,并执行它
  15. public function make($alias)
  16. {
  17. // 返回 本类实例容器中
  18. return $this->instance[$alias]();
  19. }
  20. }

1205/lessonl/demo1.php
<?php

  1. namespace _1205;
  2. require 'Product.php';
  3. require 'Maker.php';
  4. //先不用容器
  5. class Client1
  6. {
  7. //输出商品与制造商
  8. public function show()
  9. {
  10. //创建产品的实例
  11. $product = new Product();
  12. //创建制造商的实例
  13. $maker = new Maker();
  14. //制造商注入到产品类中
  15. return $product->get($maker);
  16. }
  17. }
  18. //客户端调用
  19. echo (new Client1())->show();




作业二

总结

1、单利模式只能实例化一个类,相同的方法可以用接口, 工厂模式可以实例化多个对象

2、创建容器后必须创建类成员(类实例容器) protected $inser = []; 还要使用use 类

3、spl_autoload_register() 方法将路拼接封装,实现自动加载文件

4、如果每天努力的完成任务也就不会那么多的作业,不应该相信有周六、周天,大把的时间,这两天是用来复习学习过的知识!
5、用自己的方法去写注释,发现很多都很写出来,自己不能写出来,可能是写的太少了,也知道了自己的不足!

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