php单实现
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...";
}
}
// 使用示例
$singleton = Singleton::getInstance();
$singleton->doSomething();
线程安全考虑
在 PHP 的多线程环境中(如 pthreads 扩展),需要额外考虑线程安全。可以通过加锁实现:

class ThreadSafeSingleton {
private static $instance;
private static $lock = false;
private function __construct() {}
public static function getInstance() {
if (!isset(self::$instance)) {
while (self::$lock) {
usleep(100);
}
self::$lock = true;
self::$instance = new self();
self::$lock = false;
}
return self::$instance;
}
}
继承单例类
如果需要继承单例类,可以将构造函数改为 protected:
protected function __construct() {}
子类需要重写 getInstance 方法:
class ChildSingleton extends Singleton {
private static $instance;
public static function getInstance() {
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
常见应用场景
数据库连接池 日志记录器 配置管理 缓存系统
注意事项
单例模式可能引入全局状态,不利于单元测试 过度使用单例可能导致代码耦合度高 在 PHP-FPM 环境下,每个请求都是独立的,单例的生命周期仅限于当前请求






