php实现单例模式
单例模式简介
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。在PHP中实现单例模式通常用于数据库连接、日志记录器等需要全局唯一实例的场景。
实现单例模式的关键点
私有化构造函数,防止外部直接实例化 私有化克隆方法,防止通过克隆创建新实例 静态变量保存唯一实例 静态方法提供全局访问入口
PHP单例模式基础实现
class Singleton
{
private static $instance;
private function __construct()
{
// 防止外部实例化
}
private function __clone()
{
// 防止克隆
}
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
线程安全改进版
在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;
}
}
延迟初始化变体
某些情况下可能需要延迟初始化:

class LazySingleton
{
private static $instance;
private function __construct()
{
// 资源密集型初始化操作
}
public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
单例模式使用示例
$instance1 = Singleton::getInstance();
$instance2 = Singleton::getInstance();
var_dump($instance1 === $instance2); // 输出 true
注意事项
单例模式可能引入全局状态,使代码更难测试 在PHP-FPM环境下,每个请求都是独立进程,单例只在当前请求生命周期内有效 考虑使用依赖注入替代单例模式以提高可测试性






