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 相关文章推荐
xajax写的留言本
Nov 25 PHP
Fine Uploader文件上传组件应用介绍
Jan 06 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
Jun 25 PHP
php strrpos()与strripos()函数
Aug 31 PHP
CodeIgniter输出中文乱码的两种解决办法
Jun 12 PHP
PHP实现货币换算的方法
Nov 29 PHP
jquery+php实现导出datatables插件数据到excel的方法
Jul 06 PHP
php图片水印添加、压缩、剪切的封装类实现
Apr 18 PHP
phpcms中的评论样式修改方法
Oct 21 PHP
php array_pop 删除数组最后一个元素实例
Nov 02 PHP
PHP设计模式之策略模式原理与用法实例分析
Apr 04 PHP
php5对象复制、clone、浅复制与深复制实例详解
Aug 14 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
win7+apache+php+mysql环境配置操作详解
2013/06/10 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
PHP 的比较运算与逻辑运算详解
2016/05/12 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
记录几个javascript有关的小细节
2007/04/02 Javascript
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
js微信支付实现代码
2016/12/22 Javascript
js/jq仿window文件夹移动/剪切/复制等操作代码
2017/03/08 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
写一个Vue loading 插件
2020/11/09 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python实现的寻找前5个默尼森数算法示例
2018/03/25 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
Python搭建代理IP池实现接口设置与整体调度
2019/10/27 Python
python实现字符串和数字拼接
2020/03/02 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
上海期货面试题
2014/01/31 面试题
业务员岗位职责
2013/11/16 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
2015年高一班主任工作总结
2015/05/13 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
离职证明格式样本
2015/06/12 职场文书
css height属性中的calc方法详解
2021/06/03 HTML / CSS
JS函数式编程实现XDM一
2022/06/16 Javascript