此篇为单例模式的扩展应用,配合上一篇单例模式则食用更佳
单例模式
定义
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();
|
参考链接
- https://segmentfault.com/a/1190000021323559