PHP中用Trait封装单例模式的实现


Posted in PHP onDecember 18, 2019

单例模式的定义

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

解决的问题

即一个类只被实例化一次,当其他人对其再次实例化时,返回第一次实例化的对象,可以避免大量的 new 操作,减少资源的消耗。

原则:四步走,三私一公

  • 私有化静态属性
  • 私有化构造方法
  • 私有化克隆方法
  • 公有化静态方法

封装背景

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

Trait来封装单例

php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性
用法: 通过在类中使用 use 关键字,声明要组合的 Trait 名称,具体的 Trait 的声明使用 Trait关键词,Trait不能被实例化。

Code示例

创建一个Trait

<?php 
/** 
 * Trait Singleton 单例模式 
 */ 
 
Trait Singleton 
{ 
 
 private static $instance = null; 
 
 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; 
 } 
}

多继承用法

其他类只用在代码中 use Singleton; ,即可继承单例了

<?php 
/** 
 * Desc: 业务类1 继承实例
 */ 
 
class YieWu1
{ 
 use Singleton; // 关键一行代码
 
 public function getInfo(){
   // 业务代码
 }
}
<?php 
/** 
 * Desc: 业务类2 继承实例
 */ 
 
class YieWu2
{ 
 use Singleton; // 关键一行代码
 
 public function getInfo(){
   // 业务代码
 }
}

实列调用

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 面试碰到过的问题 在此做下记录
Jun 09 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
Nov 07 PHP
PHP中redis的用法深入解析
Feb 20 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
php微信公众开发之获取周边酒店信息的方法
Dec 22 PHP
php定义参数数量可变的函数用法实例
Mar 16 PHP
php遍历CSV类实例
Apr 14 PHP
php里array_work用法实例分析
Jul 13 PHP
简单了解PHP编程中数组的指针的使用
Nov 30 PHP
php中文乱码问题的终极解决方案汇总
Aug 01 PHP
PHP结合Vue实现滚动底部加载效果
Dec 17 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 #PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 #PHP
Laravel等框架模型关联的可用性浅析
Dec 15 #PHP
php获取是星期几的的一些常用姿势
Dec 15 #PHP
Yii2框架中一些折磨人的坑
Dec 15 #PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
Dec 13 #PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 #PHP
You might like
比较时间段一与时间段二是否有交集的php函数
2011/05/31 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
php测试kafka项目示例
2020/02/06 PHP
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
jQuery删除节点的三个方法即remove()detach()和empty()
2013/12/27 Javascript
js中匿名函数的创建与调用方法分析
2014/12/19 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
JavaScript自定义文本框光标
2017/03/05 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
详解react-redux插件入门
2018/04/19 Javascript
实例讲解JavaScript截取字符串
2018/11/30 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
js实现简单的日历显示效果函数示例
2019/11/25 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
深入解析Python中的descriptor描述器的作用及用法
2016/06/27 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
美国家具网站:Cymax
2016/09/17 全球购物
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
小学门卫岗位职责
2013/12/17 职场文书
物流专员岗位职责
2014/02/17 职场文书
太太口服液广告词
2014/03/20 职场文书
四年级小学生评语
2014/12/26 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
实习报告范文
2019/07/30 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
python必学知识之文件操作(建议收藏)
2021/05/30 Python