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 相关文章推荐
输出控制类
Oct 09 PHP
php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 PHP
PHP使用CURL_MULTI实现多线程采集的例子
Jul 29 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
smarty高级特性之过滤器的使用方法
Dec 25 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
PHP与以太坊交互详解
Aug 24 PHP
Thinkphp5.0框架的Db操作实例分析【连接、增删改查、链式操作等】
Oct 11 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多图上传小程序代码
2011/07/17 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
php实现session共享的实例方法
2019/09/19 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
javascript同页面多次调用弹出层具体实例代码
2013/08/16 Javascript
jquery实现简单实用的打分程序实例
2015/07/23 Javascript
AngularJS的一些基本样式初窥
2015/07/27 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
2017/07/06 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
python 正则式使用心得
2009/05/07 Python
bat和python批量重命名文件的实现代码
2016/05/19 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
Vans英国官方网站:美国南加州的原创极限运动潮牌
2017/01/20 全球购物
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
销售类求职信
2014/06/13 职场文书
上课说话检讨书
2015/01/27 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
Python中递归以及递归遍历目录详解
2021/10/24 Python
MySQL提取JSON字段数据实现查询
2022/04/22 MySQL
小喇叭开始广播了! 四十多年前珍贵老照片
2022/05/09 无线电
关于pytest结合csv模块实现csv格式的数据驱动问题
2022/05/30 Python
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技