Blogger Information
Blog 34
fans 2
comment 0
visits 23174
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
12月5号作业,例模式、工厂模式、依赖注入,MVC小案例
遗忘了寂寞
Original
1140 people have browsed it

单例模式

  1. <?php
  2. namespace _120502;
  3. // 单例模式
  4. class Db
  5. {
  6. // 构造方法私有化
  7. private function __construct(...$connectParams)
  8. {
  9. $dsn = $connectParams[0];
  10. $username = $connectParams[1];
  11. $password = $connectParams[2];
  12. self::$pdo = new \PDO($dsn, $username, $password);
  13. }
  14. // 目前 只能在类中的内部将类实例化
  15. // 当前类的实例
  16. public static $pdo = null;
  17. // 实例化当前类的方法
  18. public static function getInstance(...$connectParams)
  19. {
  20. // 实例化当前类,并返回类实例/对象
  21. // 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它
  22. if (is_null(self::$pdo)) {
  23. // 构造函数不需要返回
  24. new self(...$connectParams);
  25. }
  26. return self::$pdo;
  27. }
  28. // 禁用克隆魔术方法
  29. private function __clone()
  30. {
  31. // ...
  32. }
  33. }
  34. $connectParams = ['mysql:host=localhost;dbname=tj_ys', 'root', '123123'];
  35. $pdo = Db::getInstance(...$connectParams);
  36. $use=$pdo->query('SELECT * FROM `user`')->fetchAll();
  37. echo '<pre>' . print_r($use, true) . '</pre>';

工厂模式

  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, 100);
  34. echo '<br>';
  35. Factory::create(Test2::class, 100, 200);
  36. echo '<br>';
  37. Factory::create(Test3::class, 100, 200, 300);

依赖注入

  1. <?php
  2. // 依赖注入: 解决对象调用之间耦合
  3. // 工作类
  4. class Person
  5. {
  6. // 要依赖的外部对象
  7. private $car = null;
  8. // 在构造方法中将依赖的外部对象全部实例化
  9. // 注入点放到构造方法中
  10. public function __construct(Car $car)
  11. {
  12. $this->car = $car;
  13. }
  14. // 外部对象执行一个动作
  15. public function work()
  16. {
  17. return $this->car->drive();
  18. }
  19. }
  20. // 依赖的外部类
  21. class Car
  22. {
  23. public function drive()
  24. {
  25. return '开车去上班';
  26. }
  27. }
  28. // 实例化类
  29. $car = new Car();
  30. $person = new Person($car);
  31. echo $person->work();

mvc案例

base\inc1\Car.php

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

base\inc1\Plane.php

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

base\inc1\Train.php

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

base\autoload.php

  1. <?php
  2. spl_autoload_register(function ($className){
  3. $path = str_replace('\\', '/', $className);
  4. require dirname(__DIR__) . DIRECTORY_SEPARATOR . $path . '.php';
  5. });

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. }
  26. }
  27. // 调用外部一个依赖对象
  28. public function travelModel()
  29. {
  30. return $this->vehicle->drive() . ' : 去旅行';
  31. }
  32. }
  33. // 客户端调用
  34. echo (new Travel1('car'))->travelModel(), '<br>';
  35. echo (new Travel1('train'))->travelModel(), '<br>';
  36. echo (new Travel1('plane'))->travelModel(), '<br>';

base\Travel2.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. switch (strtolower($vehicle)) {
  16. case 'car':
  17. self::$instance = new Car();
  18. break;
  19. case 'train':
  20. self::$instance = new Train();
  21. break;
  22. case 'plane':
  23. self::$instance = new Plane();
  24. }
  25. // 返回当前具体的交通工具
  26. return self::$instance;
  27. }
  28. }
  29. class Travel2
  30. {
  31. // 交通工具
  32. private $vehicle;
  33. // 构造方法
  34. public function __construct($vehicle)
  35. {
  36. $this->vehicle = Factory::getInstance($vehicle);
  37. }
  38. // 调用外部一个依赖对象
  39. public function travelModel()
  40. {
  41. return $this->vehicle->drive() . ' : 去旅行';
  42. }
  43. }
  44. // 客户端调用
  45. echo (new Travel2('car'))->travelModel(), '<br>';
  46. echo (new Travel2('train'))->travelModel(), '<br>';
  47. echo (new Travel2('plane'))->travelModel(), '<br>';

base\inc2\Car.php

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

base\inc2\iVehicle.php

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

base\inc2\Plane.php

  1. <?php
  2. namespace base\inc2;
  3. class Plane implements iVehicle
  4. {
  5. public function drive()
  6. {
  7. return '乘飞机';
  8. }
  9. }

base\inc2\Ship.php

  1. <?php
  2. namespace base\inc2;
  3. class Ship implements iVehicle
  4. {
  5. public function drive()
  6. {
  7. return '坐轮船';
  8. }
  9. }

base\inc2\Train.php

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

base\Travel3.php

  1. <?php
  2. // 旅行类:
  3. namespace base;
  4. // 设置引用的外部类名的别名
  5. use base\inc2\Car;
  6. use base\inc2\Train;
  7. use base\inc2\Plane;
  8. use base\inc2\Ship;
  9. use base\inc2\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>';

总结:

学习了什么是单例模式、工厂模式
学习了使用依赖注入来解决对象调用之间耦合

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