php单利设计模式有哪些
原创PHP单例设计模式详解
单例设计模式是一种常用的软件设计模式,它在应用程序中确保一个类只有一个实例,并提供一个全局访问点。在PHP开发中,单例模式广泛用于数据库连接、配置管理、日志记录等场景。本文将介绍几种常见的PHP单例设计模式实现方法。
1. 普通单例模式
普通的单例模式实现重点通过以下步骤:
- 将构造方法私有化,防止外部通过new关键字创建对象实例;
- 定义一个私有静态属性,用于存储实例;
- 定义一个公共静态方法,用于获取实例;
class Singleton
{
private static $instance;
private function __construct()
{
// 构造方法私有化
}
public static function getInstance()
{
if (null === self::$instance) {
self::$instance = new Singleton();
}
return self::$instance;
}
}
2. 静态延迟加载单例模式
静态延迟加载单例模式在普通单例模式在出现的同时,通过使用PHP 5.3+版本的匿名函数来实现延迟加载。这样,只有当第一次调用getInstance方法时,才会创建实例。
class Singleton
{
private static $instance;
private function __construct()
{
// 构造方法私有化
}
public static function getInstance()
{
if (null === self::$instance) {
self::$instance = function () {
return new Singleton();
};
}
return self::$instance();
}
}
3. 序列化与反序列化保险单例模式
当单例对象被序列化和反序列化时,大概会创建多个实例。为了解决这个问题,可以在单例类中添加一个魔术方法__wakeup,确保反序列化时不会创建新实例。
class Singleton
{
private static $instance;
private function __construct()
{
// 构造方法私有化
}
public static function getInstance()
{
if (null === self::$instance) {
self::$instance = new Singleton();
}
return self::$instance;
}
public function __wakeup()
{
// 防止反序列化创建多个实例
self::$instance = $this;
}
}
4. 多例模式(变种)
多例模式是单例模式的一个变种,允许创建多个相同类型的对象实例,但实例的数量是有限的。以下是一个单纯的多例模式实现:
class Multiton
{
private static $instances = [];
private function __construct()
{
// 构造方法私有化
}
public static function getInstance($key)
{
if (!isset(self::$instances[$key])) {
self::$instances[$key] = new Multiton();
}
return self::$instances[$key];
}
}
总结:PHP单例设计模式可以确保一个类只有一个实例,并提供全局访问点。通过普通单例模式、静态延迟加载单例模式、序列化与反序列化保险单例模式以及多例模式等实现方案,可以灵活地应用于不同的场景。