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 编程请选择正确的文本编辑软件
Dec 21 PHP
PHP 常用函数库和一些实用小技巧
Jan 01 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
一个PHP的QRcode类与大家分享
Nov 13 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
php实现的Cookies操作类实例
Sep 24 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
Jul 18 PHP
Yii2实现UploadedFile上传文件示例
Feb 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
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 #PHP
详解no input file specified 三种解决方法
Nov 29 #PHP
You might like
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
Jquery 扩展方法
2010/05/06 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
python client使用http post 到server端的代码
2013/02/10 Python
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
详解如何设置Python环境变量?
2019/05/13 Python
Python实现直方图均衡基本原理解析
2019/08/08 Python
使用python将excel数据导入数据库过程详解
2019/08/27 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
python数据抓取3种方法总结
2021/02/07 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
高中军训第一天感言
2014/03/06 职场文书
感恩的演讲稿
2014/05/06 职场文书
企业优秀员工事迹材料
2014/05/28 职场文书
小学社会实践活动总结
2014/07/03 职场文书
2014年电话客服工作总结
2014/12/09 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
总结Python使用过程中的bug
2021/06/18 Python
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server
浅谈JavaScript作用域
2021/12/06 Javascript