博客列表 >了解抽象类和接口,并简单演示其应用场景(0722)

了解抽象类和接口,并简单演示其应用场景(0722)

丶久而旧之丶
丶久而旧之丶原创
2020年08月11日 15:55:31795浏览

抽象类和接口


抽象类(部分分离设计与实现)

抽象类的声明

  • 抽象类:只用于当做父类,不允许实例化,只能通过子类调用属性和方法(部分分离了设计与实现)

  • 通过abstract关键字声明抽象类(设计)

  1. <?php
  2. abstract class User
  3. {
  4. // 类中成员属性和方法尽量用protected和private声明
  5. // 成员属性
  6. protected $name = '小殇';
  7. // 方法
  8. protected function write()
  9. {
  10. return "姓名:{$this->name}";
  11. }
  12. // 声明一个抽象方法(在子类中必须实现,不然会报错)
  13. abstract protected function write2();
  14. }
  15. // 子类:实现,使用抽象类中的属性和方法
  16. class Rob extends User
  17. {
  18. public function write1()
  19. {
  20. return parent::write();
  21. }
  22. // 实现抽象类中的抽象方法
  23. public function write2()
  24. {
  25. return "你可以叫我{$this->name}";
  26. }
  27. }
  28. $rob = new Rob;
  29. echo $rob->write1(), '<hr>';
  30. echo $rob->write2();

抽象方法在实现类中必须实现

接口(完全分离设计与实现)

  • 接口声明(关键字interface声明接口)

  • 接口中的成员都是抽象的

  • 接口的访问控制必须是public

  • 接口内不允许有属性,但允许有接口常量(禁止重写)

单接口

  1. <?php
  2. interface iUser
  3. {
  4. // 接口常量
  5. const LOCATION = '江西';
  6. // 抽象方法
  7. public function write();
  8. }
  9. // 接口的实现类(关键字implements)
  10. class User implements iUser
  11. {
  12. protected $name = '小殇';
  13. // 实现接口中的抽象方法
  14. public function write()
  15. {
  16. return "姓名:{$this->name},所在地:" . iUser::LOCATION;
  17. }
  18. }
  19. $user = new User;
  20. echo $user->write();

接口的继承

  • PHP是禁止多重继承(单继承)
  • 通过接口可以实现类似多重继承
  1. <?php
  2. // 接口1
  3. interface iUser1
  4. {
  5. const NAME = '小殇';
  6. }
  7. // 接口2
  8. interface iUser2
  9. {
  10. const LOCATION = '江西';
  11. }
  12. // 接口3(继承接口2)
  13. interface iUser3 extends iUser2
  14. {
  15. public function write();
  16. }
  17. // 接口实现类(实现接口1和接口3)
  18. class User implements iUser3, iUser1
  19. {
  20. public function write()
  21. {
  22. return "姓名:" . self::NAME . ",所在地:" . self::LOCATION;
  23. }
  24. }
  25. $user = new User;
  26. echo $user->write();

用抽象类实现接口(演示数据库操作)

  1. <?php
  2. // 接口
  3. // 引入PDO参数的配置文件
  4. require __DIR__ . '/../0720/config.php';
  5. interface iDbBase
  6. {
  7. // 新增
  8. public function insert($db, $date = []);
  9. // 查询
  10. public function select($db, $optoins);
  11. // 更新
  12. public function update($db, $options = []);
  13. // 删除
  14. public function delete($db, $where);
  15. }
  16. // 用抽象类实现接口
  17. abstract class aDb implements iDbBase
  18. {
  19. // 实现类实现接口方法,操作数据库有一些公共操作可以写在中间的抽象类中实现它
  20. // 比如实现数据表各个操作都需要连接数据库可以在抽象类中实现
  21. protected static $db = null;
  22. public static function connect()
  23. {
  24. if (is_null(self::$db)) {
  25. self::$db = new PDO(DB_DSN, DB_USER, DB_PSD);
  26. }
  27. return self::$db;
  28. }
  29. }
  30. // 最后的工作类(实现类)
  31. class DB extends aDb
  32. {
  33. // 实现接口中的方法
  34. // 新增操作
  35. public function insert($db, $date = [])
  36. {
  37. $stmt = $db->prepare("INSERT `apple` SET `username`=?,`password`=?,`sex`=?");
  38. if ($stmt->execute([$date[0], $date[1], $date[2]])) {
  39. printf("新增成功 %s 条数据,新增的主键id= %d<hr>", $stmt->rowCount(), $db->LastInsertId());
  40. }
  41. }
  42. // 更新操作
  43. public function update($db, $opctions = [])
  44. {
  45. $stmt = $db->prepare("UPDATE `apple` SET `username`=?,`password`=?,`sex`=? WHERE `id`=?");
  46. if ($stmt->execute([$opctions[0], $opctions[1], $opctions[2], $opctions[3]])) {
  47. printf("更新成功 %s 条数据<hr>", $stmt->rowCount());
  48. }
  49. }
  50. // 查询操作
  51. public function select($db, $opctions)
  52. {
  53. $stmt = $db->prepare("SELECT `id`,`username`,`sex` FROM `apple` WHERE `id`>?");
  54. $stmt->execute([$opctions]);
  55. foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) {
  56. vprintf("序号:%d,姓名:%s,性别:%s<br>", $user);
  57. }
  58. }
  59. // 删除操作
  60. public function delete($db, $where)
  61. {
  62. $stmt = $db->prepare("DELETE FROM `apple` WHERE `id`=?");
  63. if ($stmt->execute([$where])) {
  64. printf("删除成功 %s 条数据<hr>", $stmt->rowCount());
  65. }
  66. }
  67. }
  68. // 调用
  69. $a = new DB;
  70. // 插入操作
  71. $a->insert(DB::connect(), ['小美人', sha1(888), '女']);
  72. // 更新操作
  73. $a->update(DB::connect(), ['小星', sha1(999), '男', 28]);
  74. // 删除操作
  75. $a->delete(DB::connect(), 20);
  76. // 查询操作
  77. $a->select(DB::connect(), 20);

实现类中的方法也可写作静态方法通过类名调用

初识trait(临时类,类中类)

  • 继承实现了一个类的纵向扩展,trait实现了一个类的横向扩展

  • trait可以使用类的语法但本质不是类也就是不能实例化对象

  1. <?php
  2. trait tDemo
  3. {
  4. // 1.常规成员
  5. protected $name = '小殇';
  6. public function getName()
  7. {
  8. return "姓名:{$this->name}";
  9. }
  10. // 2.静态成员
  11. protected static $motto = '好好学习,天天向上';
  12. public function getMotto()
  13. {
  14. return "人生格言:" . self::$motto;
  15. }
  16. // 3.抽象成员
  17. public static $like;
  18. abstract public function getLike();
  19. }
  20. // trait要在实现类中使用
  21. class User
  22. {
  23. // 引用trait(如果trait内有抽象方法,那么在实现类中必须实现)
  24. use tDemo;
  25. public function getLike()
  26. {
  27. return self::$like;
  28. }
  29. }
  30. $user = new User;
  31. // 抽象成员赋值
  32. User::$like = '打游戏';
  33. echo '姓名:' . $user->getName() . '爱好:' . $user->getLike() . '人生格言:' . $user->getMotto();

总结

1.对于抽象类和接口有了一定的认识
2.接口实现数据库操作时碰到挺多问题的,不过最后解决时心里挺有成就感的

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