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&amp;MYSQL服务器配置说明
Oct 09 PHP
php判断字符以及字符串的包含方法属性
Aug 30 PHP
获取远程文件大小的php函数
Jan 11 PHP
php 面向对象的一个例子
Apr 12 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
一个PHP针对数字的加密解密类
Mar 20 PHP
php筛选不存在的图片资源
Apr 28 PHP
php中JSON的使用方法
Apr 30 PHP
PHP变量赋值、代入给JavaScript中的变量
Jun 29 PHP
值得分享的php+ajax实时聊天室
Jul 20 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
Banner程序
2006/10/09 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
fleaphp crud操作之findByField函数的使用方法
2011/04/23 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
jQuery1.6 使用方法二
2011/11/23 Javascript
javascript的BOM汇总
2015/07/16 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
Vue实现随机验证码功能
2020/12/29 Vue.js
详解Python3中yield生成器的用法
2015/08/20 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python中装饰器学习总结
2018/02/10 Python
python实现聚类算法原理
2018/02/12 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
ASP.NET中的身份验证有那些
2012/07/13 面试题
造型师求职自荐信
2013/09/27 职场文书
英语系毕业生自荐信
2013/10/31 职场文书
办公室副主任岗位职责
2013/11/25 职场文书
党员入党表决心的话
2014/03/11 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
解除劳动合同协议书
2014/09/17 职场文书
重阳节活动主持词
2015/07/04 职场文书
护士岗位竞聘书
2015/09/15 职场文书
2016中秋节问候语
2015/11/11 职场文书
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript