博客列表 >12月5日作业 - 设计模式与服务容器

12月5日作业 - 设计模式与服务容器

SmileHoHo
SmileHoHo原创
2019年12月06日 16:51:31677浏览

设计模式与服务容器

1.单例模式

  1. <?php
  2. namespace _1205;
  3. use PDO;//引用PDO别名
  4. //单例模式
  5. //创建类
  6. class Temp{
  7. }
  8. //创建两个对象
  9. $obj1 = new Temp();
  10. $obj2 = new Temp();
  11. var_dump($obj1,$obj2);//查看对象
  12. var_dump($obj1===$obj2);//查看对象是否完全相同,返回值是false
  13. echo '<hr>';
  14. //单例模式的原理
  15. class Demo1{
  16. //构造方法 private:私有化,在类外部就不可以被实例化了
  17. private function __construct(){
  18. }
  19. //目前只能在类中的内部将类实例化
  20. public static $instance = null;//当前类的实例,声明为静态
  21. //实例化当前类的方法,声明为静态方法
  22. public static function getInstance(){//不需要参数
  23. //实例化当前类,并且返回类实例/对象
  24. //判断当前类是否已被实例化了,如果没有就实例化,如果已实例化就返回
  25. if (is_null(self::$instance)){
  26. self::$instance = new self();
  27. }
  28. return self::$instance;
  29. }
  30. //禁用克隆魔术方法
  31. private function __clone(){
  32. }
  33. }
  34. $obj1 = Demo1::getInstance();//Demo1中的getInstance方法
  35. $obj2 = Demo1::getInstance();//Demo2中的getInstance方法
  36. var_dump($obj1 === $obj2);
  37. var_dump($obj1, $obj2);
  38. echo '<hr>';
  39. // 单例模型应用场景==>数据库连接
  40. class Db{
  41. // 构造方法 private:私有化,在类的外部不可以被实例化,在内部可以调用
  42. //...$connectParams 剩余参数
  43. private function __construct(...$connectParams){
  44. $dsn = $connectParams[0];
  45. $username = $connectParams[1];
  46. $password = $connectParams[2];
  47. self::$pdo = new PDO($dsn, $username, $password);
  48. }
  49. // 目前 只能在类中的内部将类实例化
  50. // 当前类的实例
  51. public static $pdo = null;
  52. // 实例化当前类的方法
  53. public static function getInstance(...$connectParams){
  54. // 实例化当前类,并返回类实例/对象
  55. // 判断当前类是否已经被实例化过了,如果没有的话就实例化,如果已实例化,就返回它
  56. if (is_null(self::$pdo)) {
  57. // 构造函数不需要返回
  58. new self(...$connectParams);
  59. }
  60. return self::$pdo;
  61. }
  62. // 禁用克隆魔术方法
  63. private function __clone()
  64. {
  65. }
  66. }
  67. $connectParams = ['mysql:host=localhost;dbname=php2020', 'root', '123456'];
  68. $pdo = Db::getInstance(...$connectParams);
  69. print_r($pdo->query('SELECT * FROM `user`')->fetchAll());//获取到表中所有数据

2.工厂模式

  1. <?php
  2. namespace _1205;
  3. //工厂模式:用于批量创建类的实例/对象
  4. //创建类
  5. class Demo2{
  6. }
  7. //创建类实例
  8. $obj = new Demo2();
  9. $obj = new Demo2();
  10. $obj = new Demo2();
  11. class Test1{
  12. public function __construct($arg1){
  13. echo '对象创建成功,参数是:'. $arg1;
  14. }
  15. }
  16. class Test2{
  17. public function __construct($arg1,$arg2){
  18. echo '对象创建成功,参数是:'.$arg1.','. $arg2;
  19. }
  20. }
  21. class Test3{
  22. public function __construct($arg1,$arg2,$arg3){
  23. echo '对象创建成功,参数是:'.$arg1 .','.$arg2.','.$arg3;
  24. }
  25. }
  26. //创建工厂类,专用于创建类实例
  27. class Factory{
  28. public static function create($classname,...$argments){
  29. return new $classname(...$argments);
  30. }
  31. }
  32. //echo Test1::class 完整的类名,带有命名空间
  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,221);

3.依赖注入

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

4.接口实现 小案例

接口文件 iVehicle.php

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

汽车 Car.php

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

飞机 Plane.php

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

自动加载文件 autoload.php

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

Demo.php

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

手抄作业:




总结:

接口类型在类方法中的应用是个难点,但面向接口编程的好处多:降低程序的耦合性

- 其能够最大限度的解耦
- 易于程序的扩展;
- 有利于程序的维护
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议