当前位置:首页 > PHP

php单例实现

2026-02-15 21:41:03PHP

单例模式简介

单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。适用于需要控制资源访问或限制实例数量的场景,如数据库连接、日志系统等。

基本实现步骤

私有化构造函数 防止外部通过new关键字创建实例:

private function __construct() {}

私有化克隆方法 防止通过克隆创建新实例:

private function __clone() {}

私有化反序列化方法 防止通过反序列化创建新实例(PHP 7.4+):

private function __wakeup() {}

静态私有属性保存实例

private static $instance = null;

静态公共方法获取实例

public static function getInstance() {
    if (self::$instance === null) {
        self::$instance = new self();
    }
    return self::$instance;
}

完整代码示例

class Singleton {
    private static $instance = null;

    private function __construct() {}
    private function __clone() {}
    private function __wakeup() {}

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

线程安全改进

PHP原生单例在CLI模式下多线程时可能需加锁:

public static function getInstance() {
    if (self::$instance === null) {
        $lock = fopen(__FILE__, 'r');
        flock($lock, LOCK_EX);
        if (self::$instance === null) {
            self::$instance = new self();
        }
        flock($lock, LOCK_UN);
        fclose($lock);
    }
    return self::$instance;
}

实际应用示例

数据库连接单例:

php单例实现

class DBConnection {
    private static $instance = null;
    private $connection;

    private function __construct() {
        $this->connection = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    }

    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getConnection() {
        return $this->connection;
    }
}

注意事项

  • 单例模式可能引入全局状态,测试时需谨慎
  • 考虑依赖注入替代方案以提高可测试性
  • 单例生命周期与请求周期相同,长时间运行的脚本需注意内存管理

标签: php
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…