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 相关文章推荐
PR值查询 | PageRank 查询
Dec 20 PHP
php checkdate、getdate等日期时间函数操作详解
Mar 11 PHP
将php数组输出html表格的方法
Feb 24 PHP
PHP函数in_array()使用详解
Aug 20 PHP
php的dl函数用法实例
Nov 06 PHP
php+mysqli事务控制实现银行转账实例
Jan 29 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
PHP实现简单搜歌的方法
Jul 28 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
Dec 22 PHP
php格式化json函数示例代码
May 12 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
php探针不显示内存解决方法
Sep 17 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
表格奇偶行设置不同颜色的核心JS代码
2013/12/24 Javascript
javascript函数重载解决方案分享
2014/02/19 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
angular动态表单制作
2018/02/23 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
2019/04/24 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[00:15]TI9地铁玩家打卡
2019/08/11 DOTA
[01:07:15]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第二场 1月25日
2021/03/11 DOTA
详解python中的装饰器
2018/07/10 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
Python线程之定位与销毁的实现
2019/02/17 Python
python变量命名的7条建议
2019/07/04 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
详解python对象之间的交互
2020/09/29 Python
python实现控制台输出颜色
2021/03/02 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
Linux的主要特性
2016/09/03 面试题
俄语专业毕业生求职信
2014/07/12 职场文书
python基础详解之if循环语句
2021/04/24 Python
Python实现位图分割的效果
2021/11/20 Python