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 相关文章推荐
zend framework多模块多布局配置
Feb 26 PHP
PHP文件操作实现代码分享
Sep 01 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
PHP开发工具ZendStudio下Xdebug工具使用说明详解
Nov 11 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
php获取四位字母和数字的随机数的实现方法
Jan 09 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
php中foreach结合curl实现多线程的方法分析
Sep 22 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
Sep 30 PHP
php表单处理操作
Nov 16 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 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+mysql扎实个人基本功
2008/03/27 PHP
Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
2013/06/19 PHP
php编写简单的文章发布程序
2015/06/18 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
JavaScript 全角转半角部分
2009/10/28 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
jQuery不兼容input的change事件问题解决过程
2014/12/05 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
[02:04]2016国际邀请赛中国区预选赛VG.R晋级之路
2016/07/01 DOTA
Python编写检测数据库SA用户的方法
2014/07/11 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
python静态方法实例
2015/01/14 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
python 随机数使用方法,推导以及字符串,双色球小程序实例
2017/09/12 Python
Python 硬币兑换问题
2019/07/29 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
python中如何写类
2020/06/29 Python
应届毕业生自我鉴定范文
2013/12/27 职场文书
农村婚礼证婚词
2014/01/08 职场文书
小学领导班子对照材料
2014/08/23 职场文书
乡镇群众路线教育实践活动整改措施
2014/10/04 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书