单例模式的实现PHP
单例模式的基本概念
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。适用于需要全局唯一对象的场景,如数据库连接、日志管理等。
PHP 单例模式的实现步骤
私有化构造函数
防止外部通过 new 创建实例,确保实例化控制权在类内部。
private function __construct() {}
私有化克隆方法
防止通过 clone 复制实例,破坏单例。
private function __clone() {}
静态私有属性保存实例
通过静态变量存储唯一实例,确保多次调用时返回同一对象。
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 多数运行环境是单线程(如 Web 请求),通常无需考虑线程安全。若需多线程场景(如 CLI 常驻进程),可通过加锁实现:
public static function getInstance() {
if (self::$instance === null) {
// 模拟加锁操作
$lock = fopen(__FILE__, 'r');
flock($lock, LOCK_EX);
if (self::$instance === null) {
self::$instance = new self();
}
flock($lock, LOCK_UN);
fclose($lock);
}
return self::$instance;
}
应用场景建议
- 数据库连接池管理。
- 配置文件全局访问。
- 日志记录器。
需谨慎使用,避免滥用导致代码耦合度增加。


