博客列表 >PHP 抽象类,接口实现增查改删

PHP 抽象类,接口实现增查改删

Dong.
Dong.原创
2020年09月01日 17:06:10779浏览

1. 抽象类: 部分的分离了”设计与实现”

注意:

  1. 抽象类不能直接被实例化,是为子类服务的
  2. 真正被实现的是子类
  3. 抽象类中的方法必须在子类中实现
  1. <?php
  2. // 抽象类: 部分的分离了"设计与实现"
  3. // 父类: 设计类
  4. abstract class User
  5. {
  6. // 这里的访问控制符,如果这个成员允许在子类中使用,应该声明为protected,否则private
  7. protected $name = '胡八一';
  8. public function write1()
  9. {
  10. return '姓名: ' .$this->name;
  11. }
  12. // 抽象方法: 没有实现,只有声明, 子类中必须实现它
  13. abstract protected function write2();
  14. }
  15. // 子类:实现类, 工作类, 真正干活的是子类
  16. class Work extends User
  17. {
  18. protected $profession = '盗墓的';
  19. public function write2()
  20. {
  21. return parent::write1() . ', 职业: ' . $this->profession;
  22. }
  23. }
  24. // User类只当作父类就不应该允许被实例化
  25. // $user = new User();
  26. // 必须通过它的子类来调用抽象类中的方法
  27. // 客户端代码
  28. $work = new Work();
  29. // echo $work->write1();
  30. echo $work->write2();

2. 接口: 完全分离了”设计与实现”

  • 类是对象的模板, 接口是类的模板
  • 估计意思是接口完全无法实例化。而且只能封装常量和方法 - 因为不允许有属性,而且禁止重写。
    • 接口类似于更为严格的模板,因此也更安全一些。
    • 关于类、接口传参这块不知道有无对应做法。后面可以摸索下。
  1. <?php
  2. // 接口: 完全分离了"设计与实现"
  3. // 类是对象的模板, 接口是类的模板
  4. // 1. 接口使用场景: 单接口
  5. interface iUser
  6. {
  7. // 在接口中所有成员都是抽象的
  8. // 接口成员的访问控制必须是public
  9. // 不允许有属性,但允许有接口常量, 禁止重写
  10. const NATION = '18';
  11. public function write();
  12. // 接口还可以有构造方法(后面讲)
  13. }
  14. // 2. 接口的实现类
  15. class User implements iUser
  16. {
  17. protected $profession = 'IT';
  18. // 接口中的抽象方法,实现类中必须实现
  19. public function write()
  20. {
  21. return '职业:'.$this->profession. ', 年龄: ' . iUser::NATION;
  22. }
  23. }
  24. // 客户端调用
  25. $user = new User();
  26. echo $user->write();

3. 接口之间的继承

  1. <?php
  2. // 接口应用场景2: 接口之间的继承
  3. // php中禁止多重继承: 单继承
  4. // 接口1
  5. interface iUser
  6. {
  7. const NATION = '18';
  8. }
  9. // 接口2
  10. interface iUser1 extends iUser
  11. {
  12. const USER_NAME = 'peter';
  13. }
  14. // 接口3
  15. interface iUser2 extends iUser, iUser1
  16. {
  17. public function write();
  18. }
  19. // 实现类
  20. // class User implements iUser, iUser1, iUser2
  21. // iUser2已经继承了iUser, iUser1,所以只需要实现iUser2就可以了
  22. class User implements iUser2
  23. {
  24. // 必须实现接口中的抽象方法
  25. public function write()
  26. {
  27. return '姓名:'.iUser1::USER_NAME. ', 年龄: ' . iUser::NATION;
  28. }
  29. }
  30. // 调用
  31. echo (new User)->write();

4. 通过接口操作数据库

  1. <?php
  2. // 定义一个数据库的CURD接口
  3. interface iDbBase
  4. {
  5. // 新增
  6. public static function insert($db, $data);
  7. // 查询
  8. public static function select($db, $optoins=[]);
  9. // 更新
  10. public static function update($db, $options);
  11. // 删除
  12. public static function delete($db, $where);
  13. }
  14. // 实现类使用抽象类来充当
  15. abstract class aDb implements iDbBase
  16. {
  17. // 使用单例模式连接: 创建类的唯一实例,唯一对象
  18. protected static $db = null;
  19. // 抽象类充当接口实现类时, 不用必须实现接口中的抽象方法
  20. // 当实现类中的方法中有一些公共操作时,可以将这些操作放在中间的抽象类中实现它
  21. public static function connect($dsn, $username, $password)
  22. {
  23. if (is_null(self::$db)) {
  24. // 如果当前连接对象是null,表示未连接数据库
  25. self::$db = new PDO($dsn, $username, $password);
  26. }
  27. return self::$db;
  28. }
  29. }
  30. // 类的真正实现类
  31. class DB extends aDb
  32. {
  33. // 新增
  34. public static function insert($db, $data)
  35. {
  36. }
  37. // 查询
  38. public static function select($db, $optoins=[])
  39. {
  40. return $db->query('SELECT * FROM `users` LIMIT 3')->fetchAll(PDO::FETCH_ASSOC);
  41. }
  42. // 更新
  43. public static function update($db, $options)
  44. {
  45. }
  46. // 删除
  47. public static function delete($db, $where)
  48. {
  49. }
  50. }
  51. // 客户端代码
  52. // 连接参数
  53. $config = [
  54. // 类型
  55. 'type' => $type ?? 'mysql',
  56. // 默认数据库主机名(IP)
  57. 'host' => $host ?? 'localhost',
  58. // 默认数据库名
  59. 'dbname' => $type ?? 'php_edu',
  60. // 默认用户名
  61. 'username' => $username ?? 'php.edu',
  62. // 默认用户的密码
  63. 'password' => $password ?? '61187118'
  64. // 默认字符编码集
  65. 'charset' => $type ?? 'utf8',
  66. // 默认端口号
  67. 'port' => $type ?? '3306',
  68. ];
  69. $dsn = sprintf('%s:host=%s;dbname=%s;',$config['type'],$config['host'],$config['dbname']);
  70. $username = $config['username'];
  71. $password = $config['password'];
  72. $db =DB::connect($dsn, $username, $password);
  73. // 调用实现类DB中的select()进行查询
  74. foreach (DB::select($db) as $user) {
  75. print_r($user);
  76. }

5. 实战抽象类abstract实现数据库接口iDbBase连接,并增删改查数据

  1. <?php
  2. //1.抽象类实现接口,iDbBase定义一个数据库的CURD接口
  3. interface iDbBase
  4. {
  5. // 新增
  6. public static function insert($db, $data);
  7. // 查询
  8. public static function select($db, $optoins = []);
  9. // 更新
  10. public static function update($db, $optoins);
  11. // 删除
  12. public static function delete($db, $where);
  13. }
  14. //2.实现类改为抽象类 abstract
  15. abstract class aDb implements iDbBase
  16. {
  17. // 使用单例模式连接:创建类的唯一实例,唯一对象
  18. protected static $db = null;
  19. // 实现类中的方法中有公共操作,放在中间的抽象类中实现它
  20. public static function connect($dns, $username, $password)
  21. {
  22. if (is_null(self::$db)) {
  23. // 如果是null 表示未连接
  24. self::$db = new PDO($dns, $username, $password);
  25. }
  26. // 如果连接成功就返回
  27. return self::$db;
  28. }
  29. }
  30. //3.创建一个真正实现类,在这个类进行(增删改查)操作
  31. class DB extends aDb
  32. {
  33. // 新增一条
  34. public static function insert($db, $data)
  35. {
  36. $stmt = $db->prepare('INSERT `users` SET `name`=?, `email`=? , `password`=?;');
  37. $stmt->execute(['Micki', '111@php.cn', sha1('micki123')]);
  38. return "受影响的记录有" . $stmt->rowCount() . "条";
  39. }
  40. // 更新id为8的数据
  41. public static function update($db, $optoins)
  42. {
  43. $stmt = $db->prepare('UPDATE `users` SET `name`=?, `email`= ?, `password`=? WHERE `id` = ?;');
  44. $stmt->execute(['Melinda', '222@php.cn', sha1('melinda123'), 8]);
  45. return "受影响的记录有" . $stmt->rowCount() . "条";
  46. }
  47. // 删除id是6的数据
  48. public static function delete($db, $where)
  49. {
  50. $stmt = $db->prepare('DELETE FROM `users` WHERE `id` = ?;');
  51. $stmt->execute([6]);
  52. return "受影响的记录有" . $stmt->rowCount() . "条";
  53. }
  54. // 查询所有数据
  55. public static function select($db, $optoins = [])
  56. {
  57. return $db->query('SELECT * FROM `users`')->fetchALL(PDO::FETCH_ASSOC);
  58. }
  59. }
  60. //4.连接参数,把config.php这个文档的数据库的参数拿来、配置、调用
  61. $config = [
  62. // 类型
  63. 'type' => $type ?? 'mysql',
  64. // 默认数据库主机名(IP)
  65. 'host' => $host ?? 'localhost',
  66. // 默认数据库名
  67. 'dbname' => $type ?? 'php_edu',
  68. // 默认字符编码集
  69. 'charset' => $type ?? 'utf8',
  70. // 默认端口号
  71. 'port' => $type ?? '3306',
  72. // 默认用户名
  73. 'username' => $username ?? 'php.edu',
  74. // 默认用户的密码
  75. 'password' => $password ?? '61187118'
  76. ];
  77. // 做配置
  78. $dsn = sprintf('%s:host=%s;dbname=%s;', $config['type'], $config['host'], $config['dbname']);
  79. $username = $config['username'];
  80. $password = $config['password'];
  81. // 调用
  82. $db = DB::connect($dsn, $username, $password);
  83. //5.打印输出
  84. // 1.新增
  85. // echo DB::insert($db, $data);
  86. // 2.修改
  87. // echo DB::update($db, $optoins);
  88. // 3.删除
  89. // echo DB::delete($db, $where);
  90. // 4.查询
  91. // 调用实现类DB中 select()查询,由于是二维数组,要遍历
  92. foreach (DB::select($db) as $user) {
  93. print_r($user);
  94. }

总结

  • 感觉抽象类与接口的作用就是为了代码复用
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议