Chaos' Blog

PHP中用Trait封装单例模式

2020-05-24

此篇为单例模式的扩展应用,配合上一篇单例模式则食用更佳

单例模式

定义

1
确保某一个类只有一个实例,不能重复实例,只能它自己实例化,而且向整个系统提供这个实例

原则

1
2
3
4
私有化静态属性
私有化构造方法
私有化克隆方法
公有化静态方法

封装背景

1
2
当项目中有多个单例类,每新建一个类,都得做三私一公的定义,就显得有些做重复工作了,
不仅仅浪费时间浪费精力,而且代码臃肿且难维护

trait封装单例

创建trait

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 private function __construct()  
{
parent::__construct();
// 私有化构造方法
}

private function __clone()
{
// 私有化克隆方法
}

public function __sleep()
{
//重写__sleep方法,将返回置空,防止序列化反序列化获得新的对象
return [];
}

public static function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new static();//这里不能new self(),self和static区别
}
return self::$instance;
}
}

多继承用法

1
2
3
4
5
6
7
8
9
10
11
12
13
 <?php  
/**
* Desc: 业务类1 继承实例
*/

class YieWu1
{
use Singleton; // 关键一行代码

public function getInfo(){
// 业务代码
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
 <?php  
/**
* Desc: 业务类2 继承实例
*/

class YieWu2
{
use Singleton; // 关键一行代码

public function getInfo(){
// 业务代码
}
}

实例调用

1
2
YieWu1::getInstance()->getInfo();
YieWu2::getInstance()->getInfo();

参考链接

  1. https://segmentfault.com/a/1190000021323559
Tags: Pattern