博客列表 >PHP大牛成长之路:接口+抽象类实现增删改查操作

PHP大牛成长之路:接口+抽象类实现增删改查操作

周Sir-BLOG
周Sir-BLOG原创
2020年07月24日 00:05:30775浏览

代码如下:

  1. <?php
  2. //数据库连接信息(extract将关联数组转为独立变量)
  3. extract($config = [
  4. 'type' => $type ?? 'mysql',
  5. 'hostname' => $hostname ??'127.0.0.1',
  6. 'database' => $database ?? 'php_pro',
  7. 'username' => $username ?? 'root',
  8. 'password' => $password ?? 'root',
  9. 'hostport' => $hostport ?? '3306',
  10. 'charset' => $charset ?? 'utf8',
  11. ]);
  12. //PDO数据源名称
  13. $dsn= sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$hostname,$database,$charset,$hostport);
  14. //数据库CURD接口类
  15. interface DbBase
  16. {
  17. // Create
  18. public static function insert($db, $data);
  19. // Update
  20. public static function update($db, $data);
  21. // Retrieve
  22. public static function select($db, $id);
  23. // Delete
  24. public static function delete($db, $id);
  25. }
  26. // 实现类使用抽象类来充当
  27. abstract class aDb implements DbBase
  28. {
  29. // 使用单例模式连接: 创建类的唯一实例,唯一对象
  30. protected static $db = null;
  31. // 抽象类充当接口实现类时, 不用必须实现接口中的抽象方法
  32. // 当实现类中的方法中有一些公共操作时,可以将这些操作放在中间的抽象类中实现它
  33. public static function connect($dsn, $username, $password)
  34. {
  35. try {
  36. // 如果当前连接对象是null,表示未连接数据库
  37. if (is_null(self::$db)){
  38. self::$db = new PDO($dsn, $username, $password);
  39. }
  40. return self::$db;
  41. } catch (PDOException $e) {
  42. exit('Connection Error: ' . $e->getMessage());
  43. }
  44. }
  45. }
  46. // 类的真正实现类
  47. class DB extends aDb
  48. {
  49. // Create
  50. public static function insert($db, $data)
  51. {
  52. $sql = 'INSERT `users` SET `username`=?, `age`=?, `email`= ?, `password`=?;';
  53. $stmt = $db->prepare($sql);
  54. $stmt->execute($data) or die(print_r($stmt->errorInfo(),true));
  55. if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $db->lastInsertId();
  56. unset($pdo);
  57. }
  58. // Update
  59. public static function update($db, $data)
  60. {
  61. $sql = 'UPDATE `users` SET `username`=?,`age`=?, `email`= ?, `password`=? WHERE `id` = ?;';
  62. $stmt = $db->prepare($sql);
  63. $stmt->execute($data);
  64. if ($stmt->rowCount() > 0) echo '更新成功 ' . $stmt->rowCount() . ' 条记录';
  65. unset($pdo);
  66. }
  67. // Retrieve
  68. public static function select($db, $id)
  69. {
  70. $sql = 'SELECT `id`,`username`,`age`,`email` FROM `users` WHERE `id` >= ?;';
  71. $stmt = $db->prepare($sql);
  72. $stmt->execute([$id]);
  73. while ($user = $stmt->fetch(PDO::FETCH_ASSOC)) {
  74. vprintf('%s | %s | %d | %s <br>', $user);
  75. }
  76. unset($pdo);
  77. }
  78. // Delete
  79. public static function delete($db, $id)
  80. {
  81. $sql = 'DELETE FROM `users` WHERE `id` = ?;';
  82. $stmt = $db->prepare($sql);
  83. $stmt->execute([$id]);
  84. if ($stmt->rowCount() > 0) echo '删除成功 ' . $stmt->rowCount() . ' 条记录';
  85. unset($pdo);
  86. }
  87. }
  88. //客户端代码:
  89. // Create----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
  90. $data = ['arwang',30,'arwang@126.com',md5('123456php.pro')];
  91. // 连接数据库
  92. $db = DB::connect($dsn, $username, $password);
  93. // 执行新增方法
  94. DB::insert($db,$data);
  95. // 输出:新增成功 1 条记录,主键id: 23
  96. // Update----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
  97. $data = ['arwang1',23,'arwang1@php.cn', md5('123456php.pro'), 23];
  98. // 连接数据库
  99. $db = DB::connect($dsn, $username, $password);
  100. // 执行新增方法
  101. DB::update($db,$data);
  102. // 输出:更新成功 1 条记录
  103. // Retrieve----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
  104. // 查询ID大于等于1的数据
  105. $id = 1;
  106. // 连接数据库
  107. $db = DB::connect($dsn, $username, $password);
  108. // 执行新增方法
  109. DB::select($db,$id);
  110. // 输出:
  111. // 15 | lixiaoming | 23 | lixiaoming@php.cn
  112. // 13 | xiaowen | 19 | xiaowen@php.cn
  113. // 12 | xiaoli | 21 | xiaoli@php.cn
  114. // 23 | arwang1 | 23 | arwang1@php.cn
  115. // Delete----↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓-↓----
  116. // 删除ID等于23的数据
  117. $id = 23;
  118. // 连接数据库
  119. $db = DB::connect($dsn, $username, $password);
  120. // 执行新增方法
  121. DB::delete($db,$id);
  122. // 输出:删除成功 1 条记录

总结:

  • 这个作业其实没有难度,根据前面学习数据库知识,在方法实现而已;
  • 实际接口以及抽象应用场景仍然模糊,什么时候用接口,抽象类?用接口及抽象类有什么好处等还是不明白。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议