博客列表 >12月5日作业--php培训九期线上班

12月5日作业--php培训九期线上班

取个名字真难
取个名字真难原创
2019年12月08日 16:19:47409浏览

单例模式

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

工厂模式

  1. <?php
  2. //工床模式
  3. class Test1
  4. {
  5. public function __construct($arg1)
  6. {
  7. echo '对象创建成功, 参数是: ' . $arg1;
  8. }
  9. }
  10. class Test2
  11. {
  12. public function __construct($arg1, $arg2)
  13. {
  14. echo '对象创建成功, 参数是: ' . implode(', ', [$arg1, $arg2]);
  15. }
  16. }
  17. class Test3
  18. {
  19. public function __construct($arg1, $arg2, $arg3)
  20. {
  21. echo '对象创建成功, 参数是: ' . implode(', ', [$arg1, $arg2, $arg3]);
  22. }
  23. }
  24. // 工厂类, 专用于创建类实例
  25. class Factory
  26. {
  27. public static function create($className, ...$argments)
  28. {
  29. return new $className(...$argments);
  30. }
  31. }
  32. // 用工厂类来创建类实例/对象
  33. Factory::create(Test1::class, 500);
  34. echo '<br>';
  35. Factory::create(Test2::class,'第一个参数','第二个参数');
  36. echo '<br>';
  37. Factory::create(Test3::class, '第一个参数','第二个参数','第三个参数');

依赖注入

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

namespace base\inc1\car;

  1. <?php
  2. namespace base\inc1;
  3. class Car
  4. {
  5. public function drive()
  6. {
  7. return '开汽车';
  8. }
  9. }

namespace base\inc1\plane;

  1. <?php
  2. namespace base\inc1;
  3. class Plane{
  4. public function drive()
  5. {
  6. return '坐***';
  7. }
  8. }

namespace base\inc1\train;

  1. <?php
  2. namespace base\inc1;
  3. class Train{
  4. public function drive()
  5. {
  6. return '坐火车';
  7. }
  8. }

namespace base\travel1.php;

  1. <?php
  2. //***类
  3. namespace base;
  4. //引用类
  5. use base\inc1\Car;
  6. use base\inc1\Train;
  7. use base\inc1\Plane;
  8. require __DIR__ .'/autoload.php';
  9. class Travel1
  10. {
  11. // 交通工具
  12. private $vehicle;
  13. // 构造方法
  14. public function __construct($vehicle)
  15. {
  16. switch (strtolower($vehicle)){
  17. case 'car';
  18. $this->vehicle=new Car();
  19. break;
  20. case 'train';
  21. $this->vehicle=new Train();
  22. break;
  23. case 'plane';
  24. $this->vehicle=new Plane();
  25. break;
  26. }
  27. }
  28. //调用外部一个对象
  29. public function travelModel()
  30. {
  31. return $this->vehicle->drive().'去玩耍';
  32. }
  33. }
  34. //客户端调用
  35. echo (new Travel1('car'))->travelModel() . '<br>';
  36. echo (new Travel1('train'))->travelModel() . '<br>';
  37. echo (new Travel1('plane'))->travelModel() . '<br>';

namespace base\travel1.php;

  1. <?php
  2. // ***类: 使用最传统的方式
  3. namespace base;
  4. // 设置引用的外部类名的别名
  5. use base\inc1\Car;
  6. use base\inc1\Train;
  7. use base\inc1\Plane;
  8. require __DIR__ . '/autoload.php';
  9. // 工厂类, 专用于创建类实例
  10. class Factory
  11. {
  12. protected static $instance = null;
  13. public static function getInstance($vehicle)
  14. {
  15. //判断是哪种交通工具
  16. switch (strtolower($vehicle)) {
  17. case 'car':
  18. self::$instance = new Car();
  19. break;
  20. case 'train':
  21. self::$instance = new Train();
  22. break;
  23. case 'plane':
  24. self::$instance = new Plane();
  25. }
  26. // 返回当前具体的交通工具
  27. return self::$instance;
  28. }
  29. }
  30. class Travel2
  31. {
  32. // 交通工具
  33. private $vehicle;
  34. // 构造方法
  35. public function __construct($vehicle)
  36. {
  37. $this->vehicle = Factory::getInstance($vehicle);
  38. }
  39. // 调用依赖对象
  40. public function travelModel()
  41. {
  42. return $this->vehicle->drive() . ' : @@@@ 去***';
  43. }
  44. }
  45. // 客户端调用
  46. echo (new Travel2('car'))->travelModel(). '<br>';
  47. echo (new Travel2('train'))->travelModel(). '<br>';
  48. echo (new Travel2('plane'))->travelModel(). '<br>';

接口

  1. <?php
  2. namespace base\inc1;
  3. // 交通工具的接口
  4. interface iVehicle
  5. {
  6. public function drive();
  7. }

ravel3.php

  1. <?php
  2. // ***类: 使用最传统的方式
  3. namespace base;
  4. // 设置引用的外部类名的别名
  5. use base\inc1\Car;
  6. use base\inc1\Train;
  7. use base\inc1\Plane;
  8. use base\inc1\Ship;
  9. use base\inc1\iVehicle;
  10. require __DIR__ . '/autoload.php';
  11. class Travel3
  12. {
  13. // 交通工具
  14. private $vehicle;
  15. // 构造方法
  16. public function __construct(iVehicle $vehicle)
  17. {
  18. $this->vehicle = $vehicle;
  19. }
  20. // 调用外部一个依赖对象
  21. public function travelModel()
  22. {
  23. return $this->vehicle->drive() . ' : ======= 去***';
  24. }
  25. }
  26. // 客户端调用
  27. $car = new Car();
  28. echo (new Travel3($car))->travelModel(), '<br>';
  29. echo (new Travel3(new Train()))->travelModel(), '<br>';
  30. echo (new Travel3(new Plane()))->travelModel(), '<br>';
  31. echo (new Travel3(new Ship()))->travelModel(), '<br>';

Container

  1. <?php
  2. //容器类
  3. namespace _1205;
  4. //引用闭包
  5. use Closure;
  6. class Container
  7. {
  8. // 类实例
  9. protected $instance=[];
  10. //将实例化过程绑定到容中
  11. public function bind($alias, Closure $process)
  12. {
  13. $this->instance[$alias]=$process;
  14. }
  15. //取出保存在容器中的实例化过程
  16. public function maker($alias)
  17. {
  18. return $this->instance[$alias];
  19. }
  20. }

Maker

  1. <?php
  2. namespace _1205;
  3. class Maker
  4. {
  5. public function get()
  6. {
  7. return '华为';
  8. }
  9. }

Product

  1. <?php
  2. namespace _1205;
  3. class Product {
  4. public function get(Maker $maker)
  5. {
  6. return '该手机是由:'.$maker->get().'生产的';
  7. }
  8. }

deomo1

  1. <?php
  2. require 'Product.php';
  3. require 'Maker.php';
  4. class Client1
  5. {
  6. // 直接输出
  7. public function show(){
  8. $product=new \_1205\Product();
  9. $make=new \_1205\Maker();
  10. return $product->get($make);
  11. }
  12. }
  13. // 调用
  14. echo (new Client1())->show();
  15. $sh=new Client1();
  16. echo $sh->show();

demo2

  1. <?php
  2. namespace _1205;
  3. require 'Product.php';
  4. require 'Maker.php';
  5. require 'Container.php';
  6. // 不用容器
  7. class Client2
  8. {
  9. // 直接输出商品与制造商
  10. public function show(Product $product, Maker $maker)
  11. {
  12. // 制造商注入到产品类中
  13. return $product->get($maker);
  14. }
  15. }
  16. // 绑定到容器中并实例化且返回
  17. $container = new Container();
  18. // 将实例化代码绑定到容器中
  19. $container->bind('product', function () {return new Product();});
  20. $container->bind('maker', function () {return new Maker();});
  21. // 创建类实例并返回
  22. $product = $container->maker('product');
  23. $maker = $container->maker('maker');
  24. echo (new Client2())->show($product, $maker);

总结

我个人对这些依赖注入、工厂类、接口、容器啥的理解就是都是围绕这个类来的,然后在这些类就像函数哪样来调用,各自完成应用的功能,然后再把这些功能进行衔接,这些单个理解起来还是很容易的就是要完整的组合起来理解 在这些中调来调去的 还没看完就已经绕晕了。

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