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中的字符串函数
Nov 24 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
如何使用Strace调试工具
Jun 03 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
PHP实现文件下载详解
Nov 27 PHP
php实现Session存储到Redis
Nov 11 PHP
ThinkPHP表单令牌错误的相关解决方法分析
May 20 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
Jun 03 PHP
PHP defined()函数的使用图文详解
Jul 20 PHP
PHP实现统计代码行数小工具
Sep 19 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
是否存在第一台收音机的说法
2021/03/01 无线电
PHP中extract()函数的妙用分析
2012/07/11 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
Laravel框架实现多数据库连接操作详解
2019/07/12 PHP
Javascript MD4
2006/12/20 Javascript
一些技巧性实用js代码小结
2009/10/14 Javascript
json 入门基础教程 推荐
2009/10/31 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
基于python实现百度语音识别和图灵对话
2020/11/02 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
毕业生个人的求职信范文
2013/12/03 职场文书
十佳班主任事迹材料
2014/01/18 职场文书
群众路线教育实践活动方案
2014/02/02 职场文书
田径运动会开幕式及主持词
2014/03/28 职场文书
施工安全生产承诺书
2014/05/23 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
2014年材料员工作总结
2014/11/19 职场文书
五年级学生期末评语
2014/12/26 职场文书
举起手来观后感
2015/06/09 职场文书
十八大观后感
2015/06/12 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
MySQL子查询中order by不生效问题的解决方法
2021/08/02 MySQL
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python
使用CSS实现黑白格背景效果
2022/06/01 HTML / CSS