php实现单例模式

PHP 单例模式实现方法
单例模式确保一个类只有一个实例,并提供一个全局访问点。以下是 PHP 中实现单例模式的常见方法。
基础实现
class Singleton {
private static $instance;
private function __construct() {
// 私有构造函数防止外部实例化
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
private function __clone() {
// 私有克隆方法防止克隆
}
private function __wakeup() {
// 私有反序列化方法防止反序列化
}
}
线程安全实现(PHP 通常不需要)
PHP 是单线程的,不需要考虑多线程安全问题。但以下代码展示了更严格的实现:
class ThreadSafeSingleton {
private static $instance;
private static $lock = false;
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
if (!self::$lock) {
self::$lock = true;
self::$instance = new self();
self::$lock = false;
}
}
return self::$instance;
}
private function __clone() {}
private function __wakeup() {}
}
延迟初始化实现
class LazySingleton {
private static $instance;
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new static();
}
return self::$instance;
}
private function __clone() {}
private function __wakeup() {}
}
继承单例基类
abstract class SingletonBase {
protected static $instances = [];
protected function __construct() {}
public static function getInstance() {
$class = get_called_class();
if (!isset(self::$instances[$class])) {
self::$instances[$class] = new static();
}
return self::$instances[$class];
}
final private function __clone() {}
final private function __wakeup() {}
}
class MySingleton extends SingletonBase {
// 具体实现
}
使用 Trait 实现
trait SingletonTrait {
private static $instance;
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
private function __clone() {}
private function __wakeup() {}
}
class MySingleton {
use SingletonTrait;
}
注意事项
- 构造函数必须声明为 private 防止外部实例化
- 必须禁用克隆方法 __clone()
- 必须禁用反序列化方法 __wakeup()
- 静态变量 $instance 用于存储唯一实例
- getInstance() 方法是获取实例的唯一途径
以上方法提供了 PHP 中实现单例模式的不同方式,可根据具体需求选择适合的实现。







