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+js iframe实现上传头像界面无跳转
Apr 29 PHP
PHP开发微信支付的代码分享
May 25 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
Aug 21 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
PHP的Socket通信之UDP通信实例
Jul 02 PHP
PHP中COOKIES使用示例
Jul 26 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
PHP后期静态绑定实例浅析
Dec 21 PHP
PHP的介绍以及优势详细分析
Sep 05 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
Mar 23 PHP
php中yii框架实例用法
Dec 22 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
杏林同学录(五)
2006/10/09 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
JavaScript实现无刷新上传预览图片功能
2017/08/02 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
[03:49]辉夜杯现场龙骑士COSER秀情商“我喜欢芬队!”
2015/12/27 DOTA
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
python中遍历文件的3个方法
2014/09/02 Python
Python中使用logging模块打印log日志详解
2015/04/05 Python
深入理解Python中的super()方法
2017/11/20 Python
Django框架自定义session处理操作示例
2019/05/27 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Python实现CNN的多通道输入实例
2020/01/17 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
心理健康教育制度
2014/01/27 职场文书
诚信考试承诺书
2014/03/27 职场文书
企业宣传标语
2014/06/09 职场文书
工厂标语大全
2014/10/06 职场文书
先进个人推荐材料
2014/12/29 职场文书
幼师小班个人总结
2015/02/12 职场文书
风雨哈佛路观后感
2015/06/03 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
python实现学生信息管理系统(面向对象)
2022/06/05 Python