当前位置:首页 > PHP

php实现单例模式

2026-02-27 14:49:15PHP

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 中实现单例模式的不同方式,可根据具体需求选择适合的实现。

php实现单例模式

标签: 模式php
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php session 实现购物车

php session 实现购物车

PHP Session 实现购物车的方法 初始化 Session 在 PHP 脚本的最开始调用 session_start() 函数,确保会话已启用。这通常在页面的顶部完成。 session_sta…