当前位置:首页 > PHP

php实现单例模式

2026-02-27 14:49:15PHP

php实现单例模式

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
分享给朋友:

相关文章

vue实现的两种模式

vue实现的两种模式

Vue 实现的两种模式 Vue.js 主要支持两种实现模式:单文件组件(SFC)和运行时编译模式。这两种模式适用于不同的开发场景和需求。 单文件组件(SFC)模式 单文件组件是 Vue.js 最常用…

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…

php实现评论功能

php实现评论功能

数据库设计 创建评论表(示例结构): CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id`…

php实现记住密码

php实现记住密码

实现记住密码功能的方法 使用PHP实现记住密码功能通常需要结合Cookie和Session技术。以下是几种常见的实现方式: 使用Cookie存储登录信息 在用户登录时创建一个长期有效的Cookie来…