将php mysql连接封装为单例类,核心做法是定义私有构造函数、静态实例属性及获取实例的公共方法,确保全局仅存在一个数据库连接对象。通过 self::$instance 检查是否已初始化,若未创建则调用 new self() 并赋值,后续请求直接返回该实例,从而避免重复连接消耗资源。

如何防止外部实例化与克隆破坏单例模式
必须将构造函数设为 private 以阻止外部使用 new 关键字创建对象,同时重载 __clone 和 __wakeup 魔术方法抛出异常,防止通过序列化或克隆机制绕过限制。这样能严格保证类内部对实例生命周期的绝对控制,任何尝试非法创建的行为都会导致致命错误。

<?php
class DbSingleton {
private static $instance = null;
private $conn;
private function __construct() {
try {
$this->conn = new mysqli('localhost', 'user', 'pass', 'db');
if ($this->conn->connect_error) {
throw new Exception('Connection failed');
}
} catch (Exception $e) {
die('Database Error: ' . $e->getMessage());
}
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function query($sql) {
return $this->conn->query($sql);
}
private function __clone() {}
private function __wakeup() {}
}
$pdo = DbSingleton::getInstance();
$result = $pdo->query('SELECT * FROM users');
var_dump($result->num_rows);
?>
如何在单例中安全执行查询并处理结果
在单例内部提供 query 等公共方法,委托给底层的 mysqli 或 PDO 对象执行SQL语句。调用方只需传入SQL字符串,获取返回的结果集对象后,通过 fetch_assoc 等方法提取数据。这种方式隐藏了底层连接细节,使业务代码更简洁,同时便于统一添加日志记录或预处理逻辑。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
立即学习“PHP免费学习笔记(深入)”;

<?php
// 复用上面的 DbSingleton 类
$db = DbSingleton::getInstance();
$sql = "SELECT id, name FROM users WHERE status = ?";
$stmt = $db->conn->prepare($sql);
$status = 'active';
$stmt->bind_param('s', $status);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo $row['name'] . "\n";
}
$stmt->close();
?>
当数据库配置变更时单例类的行为表现
由于单例在首次调用 getInstance 时即完成连接建立,后续所有请求共享同一连接句柄。如果运行时动态修改了数据库配置文件但未重新初始化单例,程序仍会使用旧配置建立的连接,直到脚本结束。这种特性保证了连接稳定性,但也意味着配置热更新需要手动重置静态变量或重启服务,否则会导致连接指向错误的数据库实例。


















