单例模式的实现PHP
单例模式的基本概念
单例模式确保一个类只有一个实例,并提供一个全局访问点。适用于需要共享资源或控制资源的场景,如数据库连接、日志管理等。
PHP 单例模式的实现步骤
私有化构造函数
防止外部通过 new 创建实例,确保实例化控制权在类内部。
private function __construct() {}
私有化克隆方法
防止通过克隆生成新实例,破坏单例的唯一性。
private function __clone() {}
静态私有属性保存实例
使用静态属性存储类的唯一实例,初始值为 null。
private static $instance = null;
静态公共方法获取实例
通过静态方法检查实例是否存在,不存在则创建并返回。
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
完整代码示例
class Singleton {
private static $instance = null;
private function __construct() {}
private function __clone() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
// 使用示例
$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();
var_dump($instance1 === $instance2); // 输出 true,证明是同一实例
线程安全考虑(PHP 多线程场景)
PHP 通常以单线程模式运行(如 FPM 或 CLI),但在多线程环境(如 pthreads 扩展)下,需加锁确保原子性。示例:
public static function getInstance() {
if (self::$instance === null) {
// 伪代码,实际需根据线程库实现锁机制
$lock = acquire_lock();
if (self::$instance === null) {
self::$instance = new self();
}
release_lock($lock);
}
return self::$instance;
}
单例模式的优缺点
优点
- 严格控制实例数量,节省系统资源。
- 提供全局访问点,便于共享数据。
缺点
- 违反单一职责原则(既管理实例又处理业务)。
- 单元测试困难(全局状态难以隔离)。
实际应用场景
- 数据库连接池管理。
- 日志记录器。
- 配置管理类。







