PHP设计模式 之 单例模式(封装PDO)
1、单例模式
单例模式:singleton,是一种类的设计只会最多产生一个对象的设计思想。单例模式的目的是为了保护资源的唯一性
- 单例模式为了解决如何只产生一个对象,需要使用以下解决方案,简称
三私一公
:- 私有化构造方法:不让在外部产生多个对象
- 私有化克隆方法:不允许对象被克隆产生新对象
- 公有化静态方法:运行进入类内部产生对象
- 私有化静态属性:保存已经产生的对象
实例:
<?php
// 1、首先定义一个空类,叫做Singleton
class Singleton {
// 2、对象的产生是通过实例化产生的,而实例化是一种不可控行为,即可以产生无限多个对象,
// 所以应该禁止:即”禁止实例化“,之所以是引号,是因为只能禁止在类外部实例化对象,私有化构造方法
private function __construct(){ echo 'hello word'; }
// 3、一旦外部不能实例化对象了,那就意味着根本“不可能”产生对象了,此时就只能想办法
// 在还没有产生对象的时候就进入到“类内部”,意味着只能通过`静态方法`让类直接进入到类的内部
public static function getInstance(){
// 4、进入类的内部依然还是没有对象,此时需要在静态方法内部进行对象实例化,
// 并且把得到的对象返回到外部
// return new self();
# 判断内部属性是否存在对象(is_object函数):最好的判定是存的对象是当前类的 instanceof
if(!(self::$object instanceof self)){
# 当前保存的内容不是当前类的对象
self::$object = new self();
}
# 返回对象给外部
return self::$object;
}
// 5、第4部开启了实例化对象的窗口,但是此时新问题出现:无限调用静态方法依然可以得到多个对象。
// 如果想要该方法只返回一个对象,就得保证类内部有办法存着某个产生的对象,第一次产生新的,后面返回旧的。此时需要使用静态属性
// 5.1 增加静态属性:私有,不允许外部修改,否则外部修改之后就没有意义了
private static $object = NULL; # 初始化为NULL,没有对象
// 5.2 判断第三步内部属性是否存在对象(is_object函数):最好的判定是存的对象是当前类的 instanceof,
// 即根据 $objec 修改函数getInstance()中的返回的内容
// 6、此时可以保证外部无论多少次调用公有静态方法获取实例,都会只得到一个对象。但是此时外部对象依然可以产生新的对象:
// 因为克隆,所以还必须禁止对象的克隆,即在类内部私有化克隆方法
private function __clone(){}
}
// 尝试外部实例化
// $demo = new Singleton(); //报错
// 外部获取对象
$s = Singleton::getInstance();
使用单例模式PDO连接数据库
<?php
/**
* PDO-MySQL数据库操作类
*/
class MySQLPDO{
//数据库默认连接信息
private $dbConfig = array(
'db' => 'mysql', //数据库类型
'host' => 'localhost', //服务器地址
'port' => '3306', //端口
'user' => 'root', //用户名
'pass' => 'weicunbin123', //密码
'charset' => 'utf8', //字符集
'dbname' => 'testguest', //默认数据库
);
//单例模式 本类对象引用
private static $instance;
//PDO实例
private $db;
/**
* 私有构造方法
* @param $params array 数据库连接信息
*/
private function __construct($params){
//初始化属性
$this->dbConfig = array_merge($this->dbConfig,$params);
//连接服务器
$this->connect();
}
/**
* 获得单例对象
* @param $params array 数据库连接信息
* @return object 单例的对象
*/
public static function getInstance($params = array()){
if(!self::$instance instanceof self){
self::$instance = new self($params);
}
return self::$instance; //返回对象
}
/**
* 私有克隆
*/
private function __clone() {}
/**
* 连接目标服务器
*/
private function connect(){
try{
//连接信息
$dsn = "{$this->dbConfig['db']}:host={$this->dbConfig['host']};port={$this->dbConfig['host']};dbname={$this->dbConfig['dbname']};charset={$this->dbConfig['charset']}";
//实例化PDO
$this->db = new PDO($dsn,$this->dbConfig['user'],$this->dbConfig['pass']);
//设定字符集
$this->db->query("set names {$this->dbConfig['charset']}");
echo 1;
}catch (PDOException $e){
//错误提示
die("数据库操作失败:{$e->getMessage()}");
}
}
/**
* 执行SQL
* @param $sql string 执行的SQL语句
* @return object PDOStatement
*/
public function query($sql){
$rst = $this->db->query($sql);
if($rst===false){
$error = $this->db->errorInfo();
die("数据库操作失败:ERROR {$error[1]}({$error[0]}): {$error[2]}");
}
return $rst;
}
/**
* 取得一行结果
* @param $sql string 执行的SQL语句
* @return array 关联数组结果
*/
public function fetchRow($sql){
return $this->query($sql)->fetch(PDO::FETCH_ASSOC);
}
/**
* 取得所有结果
* @param $sql string 执行的SQL语句
* @return array 关联数组结果
*/
public function fetchAll($sql){
return $this->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
public function demo(){
echo '测试内容';
}
}
// // 调用方式
// // 连接数据库
// $pdo = MySQLPDO::getInstance();
// // 调用方法
// $pdo -> demo()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现