欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单例模式简单运用

程序员文章站 2024-01-04 10:20:10
...

一、单例模式

单例模式:创建类的唯一实例,不允许多次实例化一个类,例如数据库的连接有最大上限 1000,NEW 一次 PDO 就会多一个类实例,前面的连接如果没释放,就会增加一个,达到最大连接数以后,后面的就不无法再连接数据库了。

将类中的构造方式私有化private, 防止从外部通过 new 实例化这个类; 转为从类的内部将它实例化——>创建一个公共的静态方法,返回当前类的唯一实例

克隆方法私有化,防止克隆当前对象: private function __clone()

1.1 单例模式代码和应用 :

  1. <?php
  2. namespace app;
  3. // 单例模式连接数据库 应用程序跟设计库交互
  4. use pdo;
  5. interface idbBase
  6. {
  7. // 数据库连接curd
  8. static function insert($pdo, $data);
  9. static function select($pdo, $where = []);
  10. static function update($pdo, $username, $password);
  11. static function delete($pdo, $username);
  12. // 数据库连接
  13. static function connect($dsn, $user, $password);
  14. }
  15. // 单例模式连接数据库
  16. abstract Class aDB implements idbBase
  17. {
  18. private static $_instance;
  19. // 将类中的构造方式私有化, 防止从外部通过new实例化这个类
  20. private function __construct()
  21. {
  22. }
  23. // 克隆方法私有化,防止克隆当前对象
  24. private function __clone()
  25. {
  26. }
  27. static function connect($dsn, $user, $password)
  28. {
  29. // 创建aDB类的唯一实例 获取唯一的pdo对象
  30. if (is_null(self::$_instance)) {
  31. // echo 2;
  32. self::$_instance = new pdo($dsn, $user, $password);
  33. }
  34. return self::$_instance;
  35. }
  36. }
  37. // 单例模式: 创建类的唯一实例
  38. class DB extends aDB
  39. {
  40. // 数据库连接curd
  41. static function insert($pdo, $data){
  42. /* INSERT INTO `staffs` (`id`, `msnv`, `name`, `hiredate`, `donvi`, `congviec`, `luongtong`, `luongthuc`)
  43. VALUES (`id`, `msnv`, `name`, `hiredate`, `donvi`, `congviec`, `luongtong`, `luongthuc`) */
  44. $username = $data[0];
  45. $password = password_hash($data[1], PASSWORD_DEFAULT);
  46. $sql = "INSERT `users` (`username`, `password`) VALUES ($username,'$password');";
  47. // echo $sql;
  48. return $pdo->query($sql);
  49. }
  50. // 查询
  51. static function select($pdo, $where = ['id' => 1]){
  52. foreach ($where as $k => $v) {
  53. $sql = $k . ' > ' . $v;
  54. }
  55. return $pdo->query("SELECT * FROM `users` WHERE " . $sql)->fetchAll(PDO::FETCH_ASSOC);
  56. }
  57. static function update($pdo, $username, $password){
  58. $password = password_hash($password, PASSWORD_DEFAULT);
  59. $sql = "UPDATE `users` SET `password` = '$password' WHERE `id`= $username;";
  60. // "UPDATE `staffs` SET `donvi` = ? WHERE `id`= ?";
  61. return $pdo->query($sql);
  62. }
  63. static function delete($pdo, $username){
  64. // DELETE FROM 表名 WHERE 删除条件
  65. $sql = "DELETE FROM `users` WHERE `username`= '$username';";
  66. return $pdo->query($sql);
  67. }
  68. }
  69. //客户端代码
  70. $config = [
  71. 'type' => $type ?? 'mysql',
  72. 'host' => $host ?? 'localhost',
  73. 'dbname' => $dbname ?? 'help_10086',
  74. 'username' => $username ?? 'root',
  75. 'password' => $password ?? 'root',
  76. 'port' => $port ?? '3306',
  77. 'charset' => $charset ?? 'utf8'
  78. ];
  79. // extract() 函数从数组中将变量导入到当前的符号表。
  80. extract($config);
  81. // sprintf() 函数把格式化的字符串写入一个变量中。
  82. $dsn = sprintf('%s:host=%s;port=%s;charset=%s;dbname=%s', $type, $host, $port, $charset, $dbname);
  83. $pdo = DB::connect($dsn, $username, $password);
  84. // var_dump(DB::select($pdo));
  85. // $res = DB::insert($pdo,['900118','123456']);
  86. // var_dump(DB::update($pdo,'900118','456789'));
  87. var_dump(DB::delete($pdo,'900118'));

上一篇:

下一篇: