Blogger Information
Blog 33
fans 0
comment 0
visits 19751
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
12月5日作业--php培训九期线上班
取个名字真难
Original
410 people have browsed it

单例模式

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

总结

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

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
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!