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数组函数序列之array_flip() 将数组键名与值对调
Nov 07 PHP
php小经验:解析preg_match与preg_match_all 函数
Jun 29 PHP
怎样使用php与jquery设置和读取cookies
Aug 08 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
CI框架常用函数封装实例
Nov 21 PHP
php实现等比例压缩图片
Jul 26 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 PHP
PHP实现微信公众号验证Token的示例代码
Dec 16 #PHP
浅析PHP中的 inet_pton 网络函数
Dec 16 #PHP
Laravel等框架模型关联的可用性浅析
Dec 15 #PHP
php获取是星期几的的一些常用姿势
Dec 15 #PHP
Yii2框架中一些折磨人的坑
Dec 15 #PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 #PHP
详解no input file specified 三种解决方法
Nov 29 #PHP
You might like
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
js判断屏幕分辨率的代码
2013/07/16 Javascript
jquery统计输入文字的个数并对其进行判断
2014/01/07 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
Ext JS框架程序中阻止键盘触发回退或者刷新页面的代码分享
2016/06/07 Javascript
AngularJS基础 ng-open 指令简单实例
2016/08/02 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
vue路由懒加载的实现方法
2018/03/12 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Python贪心算法实例小结
2018/04/22 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
python os用法总结
2018/06/08 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
python求最大值,不使用内置函数的实现方法
2019/07/09 Python
Django中的静态文件管理过程解析
2019/08/01 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
python实现代码统计程序
2019/09/19 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
CSS3中的元素过渡属性transition示例详解
2016/11/30 HTML / CSS
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
2014年安全生产责任书
2014/07/22 职场文书
演讲开头怎么书写?
2019/08/06 职场文书
Java循环队列与非循环队列的区别总结
2021/06/22 Java/Android