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 checkbox复选框值的获取与checkbox默认值输出方法
May 15 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
PHP对象转换为数组函数(递归方法)
Feb 04 PHP
php在项目中寻找代码的坏味道(综艺命名)
Jul 19 PHP
php删除数组元素示例分享
Feb 17 PHP
Codeigniter中mkdir创建目录遇到权限问题和解决方法
Jul 25 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
WordPress中注册菜单与调用菜单的方法详解
Dec 18 PHP
php使用crypt()函数进行加密
Jun 08 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
php+layui数据表格实现数据分页渲染代码
Oct 26 PHP
微信小程序发送订阅消息的方法(php 为例)
Oct 30 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
2009/06/29 PHP
一步一步学习PHP(8) php 数组
2010/03/05 PHP
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
解析php中const与define的应用区别
2013/06/18 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
PHP基于递归实现的约瑟夫环算法示例
2017/08/27 PHP
解密效果
2006/06/23 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
js实现数字跳动到指定数字
2020/08/25 Javascript
js基于canvas实现时钟组件
2021/02/07 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python的subprocess模块总结
2014/11/07 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
python 搜索大文件的实例代码
2019/07/08 Python
python关于调用函数外的变量实例
2019/12/26 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
药物学专业学生的自我评价
2013/10/27 职场文书
经贸日语专业个人求职信
2013/12/13 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
信息与计算机科学职业规划范文:成为一艘有方向的船
2014/09/11 职场文书
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL