一、单例模式
单例模式
:创建类的唯一实例,不允许多次实例化一个类,例如数据库的连接有最大上限 1000,NEW 一次 PDO 就会多一个类实例,前面的连接如果没释放,就会增加一个,达到最大连接数以后,后面的就不无法再连接数据库了。
将类中的构造方式私有化private
, 防止从外部通过 new 实例化这个类; 转为从类的内部将它实例化——>创建一个公共的静态方法,返回当前类的唯一实例
克隆方法私有化,防止克隆当前对象: private function __clone()
1.1 单例模式代码和应用 :
<?php
namespace app;
// 单例模式连接数据库 应用程序跟设计库交互
use pdo;
interface idbBase
{
// 数据库连接curd
static function insert($pdo, $data);
static function select($pdo, $where = []);
static function update($pdo, $username, $password);
static function delete($pdo, $username);
// 数据库连接
static function connect($dsn, $user, $password);
}
// 单例模式连接数据库
abstract Class aDB implements idbBase
{
private static $_instance;
// 将类中的构造方式私有化, 防止从外部通过new实例化这个类
private function __construct()
{
}
// 克隆方法私有化,防止克隆当前对象
private function __clone()
{
}
static function connect($dsn, $user, $password)
{
// 创建aDB类的唯一实例 获取唯一的pdo对象
if (is_null(self::$_instance)) {
// echo 2;
self::$_instance = new pdo($dsn, $user, $password);
}
return self::$_instance;
}
}
// 单例模式: 创建类的唯一实例
class DB extends aDB
{
// 数据库连接curd
static function insert($pdo, $data){
/* INSERT INTO `staffs` (`id`, `msnv`, `name`, `hiredate`, `donvi`, `congviec`, `luongtong`, `luongthuc`)
VALUES (`id`, `msnv`, `name`, `hiredate`, `donvi`, `congviec`, `luongtong`, `luongthuc`) */
$username = $data[0];
$password = password_hash($data[1], PASSWORD_DEFAULT);
$sql = "INSERT `users` (`username`, `password`) VALUES ($username,'$password');";
// echo $sql;
return $pdo->query($sql);
}
// 查询
static function select($pdo, $where = ['id' => 1]){
foreach ($where as $k => $v) {
$sql = $k . ' > ' . $v;
}
return $pdo->query("SELECT * FROM `users` WHERE " . $sql)->fetchAll(PDO::FETCH_ASSOC);
}
static function update($pdo, $username, $password){
$password = password_hash($password, PASSWORD_DEFAULT);
$sql = "UPDATE `users` SET `password` = '$password' WHERE `id`= $username;";
// "UPDATE `staffs` SET `donvi` = ? WHERE `id`= ?";
return $pdo->query($sql);
}
static function delete($pdo, $username){
// DELETE FROM 表名 WHERE 删除条件
$sql = "DELETE FROM `users` WHERE `username`= '$username';";
return $pdo->query($sql);
}
}
//客户端代码
$config = [
'type' => $type ?? 'mysql',
'host' => $host ?? 'localhost',
'dbname' => $dbname ?? 'help_10086',
'username' => $username ?? 'root',
'password' => $password ?? 'root',
'port' => $port ?? '3306',
'charset' => $charset ?? 'utf8'
];
// extract() 函数从数组中将变量导入到当前的符号表。
extract($config);
// sprintf() 函数把格式化的字符串写入一个变量中。
$dsn = sprintf('%s:host=%s;port=%s;charset=%s;dbname=%s', $type, $host, $port, $charset, $dbname);
$pdo = DB::connect($dsn, $username, $password);
// var_dump(DB::select($pdo));
// $res = DB::insert($pdo,['900118','123456']);
// var_dump(DB::update($pdo,'900118','456789'));
var_dump(DB::delete($pdo,'900118'));