当前位置:首页 > PHP

php单实现

2026-03-12 20:11:36PHP

PHP 单例模式实现

单例模式确保一个类只有一个实例,并提供一个全局访问点。以下是 PHP 中实现单例模式的常见方法。

基本实现步骤

私有化构造函数,防止外部直接实例化。

private function __construct() {}

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

private function __clone() {}

私有化反序列化方法,防止通过反序列化创建新实例。

php单实现

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 扩展),需要额外考虑线程安全。可以通过加锁实现:

php单实现

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 环境下,每个请求都是独立的,单例的生命周期仅限于当前请求

标签: php
分享给朋友:

相关文章

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_I…

php 实现验证码

php 实现验证码

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

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…