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手册及PHP编程标准
Dec 17 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
typecho插件编写教程(六):调用接口
May 28 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
纯PHP代码实现支付宝批量付款
Dec 24 PHP
php简单实现短网址(短链)还原的方法(测试可用)
May 09 PHP
PHP flush 函数使用注意事项
Aug 26 PHP
php封装的page分页类完整实例
Oct 18 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
超强多功能php绿色集成环境详解
Jan 25 PHP
php类自动装载、链式操作、魔术方法实现代码
Jul 23 PHP
CakePHP框架Model关联对象用法分析
Aug 04 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
smarty section简介与用法分析
2008/10/03 PHP
PHP进程同步代码实例
2015/02/12 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
2015/07/01 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
JSON为什么那样红为什么要用json(另有洞天)
2012/12/26 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
js实现日历
2020/11/07 Javascript
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
Python常用的json标准库
2019/02/19 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
家居设计专业个人自荐信范文
2013/11/26 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
个人承诺书怎么写
2014/05/24 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
广播体操比赛主持词
2015/06/29 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
采购员工作总结范文
2015/08/12 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
Python音乐爬虫完美绕过反爬
2021/08/30 Python
openstack云计算keystone组件工作介绍
2022/04/20 Servers
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL