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 相关文章推荐
fleaphp crud操作之find函数的使用方法
Apr 23 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
php从文件夹随机读取文件的方法
Jun 01 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
Symfony模板的快捷变量用法实例
Mar 17 PHP
yii2中结合gridview如何使用modal弹窗实例代码详解
Jun 12 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
PHP 中使用ajax时一些常见错误总结整理
Feb 27 PHP
php简单读取.vcf格式文件的方法示例
Sep 02 PHP
PHP中散列密码的安全性分析
Jul 26 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将gd生成的图片缓存到memcache的小例子
2013/06/05 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
JavaScript中省略元素对数组长度的影响
2016/10/26 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
vuejs指令详解
2017/02/07 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
js实现导航跟随效果
2018/11/17 Javascript
VUE 组件转换为微信小程序组件的方法
2019/11/06 Javascript
JS数组方法slice()用法实例分析
2020/01/18 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python编写登陆接口的方法
2017/07/10 Python
Python lambda函数基本用法实例分析
2018/03/16 Python
python 自定义对象的打印方法
2019/01/12 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
皮肤科医师岗位职责
2013/12/04 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
2016年离婚协议书范文
2016/03/18 职场文书