博客列表 >单例模式简单运用

单例模式简单运用

赵大叔
赵大叔原创
2022年02月22日 00:04:57526浏览

一、单例模式

单例模式:创建类的唯一实例,不允许多次实例化一个类,例如数据库的连接有最大上限 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'));
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议