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.MVC的模板标签系统(三)
Sep 05 PHP
实用函数4
Nov 08 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
php判断访问IP的方法
Jun 19 PHP
PHP工程师VIM配置分享
Dec 15 PHP
php mysql like 实现多关键词搜索的方法
Oct 29 PHP
PHP数据库操作四:mongodb用法分析
Aug 16 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
php解决安全问题的方法实例
Sep 19 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
Oct 18 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获取当前url的具体方法全面解析
2013/11/26 PHP
php绘图之在图片上写中文和英文的方法
2015/01/24 PHP
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
kindeditor 加入七牛云上传的实例讲解
2017/11/12 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
jquery实现图片按比例缩放示例
2014/07/01 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
浅谈javascript中遇到的字符串对象处理
2016/11/18 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
Python将xml和xsl转换为html的方法
2015/03/10 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
农村改厕实施方案
2014/03/22 职场文书
建议书的格式
2014/05/12 职场文书
党的群众路线调研报告
2014/11/03 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
环境卫生标语
2015/08/03 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers