编程 PHP设计模式:单例模式

2024-11-18 18:31:43 +0800 CST views 857

PHP设计模式:单例模式

目的

在整个应用程序的生命周期内(从脚本启动到结束),只能获得单例类的一个对象实例。
单例模式常用于如数据库连接等场景,多个类可以共用一个数据库连接对象,而不必每次都去 new 一个新对象,这样可以避免连接数递增导致的资源浪费。


实现原理

单例模式通过以下几个关键点来实现:

  1. 私有化 __construct 构造函数:防止外部通过 new 创建多个实例。
  2. 私有化 __clone:防止外部克隆实例,创建副本。
  3. 私有化 __wakeup:防止反序列化创建新的实例。
  4. 提供静态方法 getInstance():用于返回该类的唯一实例。

代码实现

class Singleton
{
    /**
    * @var Singleton 唯一实例
    */
    private static $instance;

    /**
    * 获取实例的静态方法,通过懒加载在第一次使用时创建实例
    *
    * @return Singleton 唯一实例
    */
    public static function getInstance(): Singleton
    {
        if (null === static::$instance) {
            static::$instance = new static();
        }
        return static::$instance;
    }

    /**
    * 构造函数私有化,防止从外部创建新的实例
    */
    private function __construct()
    {
    }

    /**
    * 禁止克隆,防止外部克隆对象
    */
    private function __clone()
    {
    }

    /**
    * 禁止反序列化,防止通过反序列化创建新实例
    */
    private function __wakeup()
    {
    }
}

测试

$singleton1 = Singleton::getInstance();
var_dump($singleton1);

$singleton2 = Singleton::getInstance();
var_dump($singleton2);

// 尝试直接实例化将会抛出错误
$singleton3 = new Singleton();
var_dump($singleton3);

测试结果

object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}

Fatal error: Uncaught Error: Call to private Singleton::__construct() 

从测试结果可以看到:

  • $singleton1$singleton2 是同一个对象实例,表明单例模式成功实现。
  • $singleton3 由于直接实例化而报错,验证了通过私有化 __construct 限制了外部创建多个实例。

总结

通过单例模式,我们可以确保在应用程序的生命周期中,某个类只能有一个对象实例。这样的设计在需要共享资源(例如数据库连接、日志管理等)时尤为重要,能够节省资源、提高系统性能。

复制全文 生成海报 设计模式 PHP 编程

推荐文章

rangeSlider进度条滑块
2024-11-19 06:49:50 +0800 CST
一个简单的打字机效果的实现
2024-11-19 04:47:27 +0800 CST
Nginx 性能优化有这篇就够了!
2024-11-19 01:57:41 +0800 CST
Python 获取网络时间和本地时间
2024-11-18 21:53:35 +0800 CST
CentOS 镜像源配置
2024-11-18 11:28:06 +0800 CST
WebSQL数据库:HTML5的非标准伴侣
2024-11-18 22:44:20 +0800 CST
html折叠登陆表单
2024-11-18 19:51:14 +0800 CST
淘宝npm镜像使用方法
2024-11-18 23:50:48 +0800 CST
一个有趣的进度条
2024-11-19 09:56:04 +0800 CST
Go语言中的mysql数据库操作指南
2024-11-19 03:00:22 +0800 CST
php内置函数除法取整和取余数
2024-11-19 10:11:51 +0800 CST
PHP 的生成器,用过的都说好!
2024-11-18 04:43:02 +0800 CST
liunx服务器监控workerman进程守护
2024-11-18 13:28:44 +0800 CST
虚拟DOM渲染器的内部机制
2024-11-19 06:49:23 +0800 CST
18个实用的 JavaScript 函数
2024-11-17 18:10:35 +0800 CST
php使用文件锁解决少量并发问题
2024-11-17 05:07:57 +0800 CST
php 连接mssql数据库
2024-11-17 05:01:41 +0800 CST
服务器购买推荐
2024-11-18 23:48:02 +0800 CST
百度开源压测工具 dperf
2024-11-18 16:50:58 +0800 CST
Python 微软邮箱 OAuth2 认证 Demo
2024-11-20 15:42:09 +0800 CST
mysql 计算附近的人
2024-11-18 13:51:11 +0800 CST
对多个数组或多维数组进行排序
2024-11-17 05:10:28 +0800 CST
程序员茄子在线接单