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 has encountered an Access Violation
Jan 15 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
php 目录遍历、删除 函数的使用介绍
Apr 28 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
destoon找回管理员密码的方法
Jun 21 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
php导入大量数据到mysql性能优化技巧
Dec 29 PHP
为你总结一些php系统类函数
Oct 21 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
php使用GD2绘制几何图形示例
Feb 15 PHP
php获取微信openid方法总结
Oct 10 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 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日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
如何离线执行php任务
2017/02/21 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
jquery实现不同大小浏览器使用不同的css样式表的方法
2014/04/02 Javascript
js 弹出新页面避免被浏览器、ad拦截的一种新方法
2014/04/30 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
python通过scapy获取局域网所有主机mac地址示例
2014/05/04 Python
Python实现子类调用父类的方法
2014/11/10 Python
python使用pymysql实现操作mysql
2016/09/13 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
python 发送json数据操作实例分析
2019/10/15 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
2019/11/26 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
Python操作Jira库常用方法解析
2020/04/10 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
python开发入门——列表生成式
2020/09/03 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
CSS3的 fit-content实现水平居中
2017/09/07 HTML / CSS
英国领先的在线鱼贩:The Fish Society
2020/08/12 全球购物
Eclipse面试题
2014/03/22 面试题
公司营业员的工作总结自我评价
2013/10/05 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
七一建党日演讲稿
2014/09/05 职场文书
男方家长婚礼答谢词
2015/09/29 职场文书
Python词云的正确实现方法实例
2021/05/08 Python
分享python函数常见关键字
2022/04/26 Python