php实现单例模式
单例模式的概念
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于数据库连接、日志记录器等需要全局唯一实例的场景。
PHP实现单例模式的关键步骤
私有化构造函数 通过将构造函数声明为私有,防止外部直接实例化对象。
private function __construct() {}
私有化克隆方法 防止通过克隆创建新实例。

private function __clone() {}
私有化反序列化方法 防止通过反序列化创建新实例。
private function __wakeup() {}
静态属性保存实例 使用静态属性保存类的唯一实例。

private static $instance;
静态方法获取实例 提供静态方法获取唯一实例,并在首次调用时创建实例。
public static function getInstance() {
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
完整代码示例
class Singleton {
private static $instance;
private function __construct() {}
private function __clone() {}
private function __wakeup() {}
public static function getInstance() {
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function doSomething() {
echo "Doing something...";
}
}
使用示例
$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();
var_dump($instance1 === $instance2); // 输出: bool(true)
$instance1->doSomething(); // 输出: Doing something...
线程安全考虑
在PHP的多线程环境下(如使用pthreads扩展),需要考虑加锁机制确保线程安全:
public static function getInstance() {
if (!isset(self::$instance)) {
$lock = new \Mutex();
$lock->lock();
if (!isset(self::$instance)) {
self::$instance = new self();
}
$lock->unlock();
}
return self::$instance;
}
适用场景
- 需要控制资源访问,如数据库连接
- 需要全局状态的共享对象
- 频繁创建销毁代价高的对象
注意事项
- 单例模式可能引入全局状态,增加耦合度
- 不利于单元测试,因为状态在测试间共享
- 在PHP-FPM环境下,每个请求都是独立进程,单例只在当前请求生命周期内有效





