博客列表 >12月5号作业,例模式、工厂模式、依赖注入,MVC小案例

12月5号作业,例模式、工厂模式、依赖注入,MVC小案例

遗忘了寂寞
遗忘了寂寞原创
2019年12月07日 19:43:161143浏览

单例模式

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

总结:

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

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