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 相关文章推荐
支持oicq头像的留言簿(二)
Oct 09 PHP
phpMyAdmin 安装教程全攻略
Mar 19 PHP
PHP set_time_limit(0)长连接的实现分析
Mar 02 PHP
php 安全过滤函数代码
May 07 PHP
PHP爆绝对路径方法收集整理
Sep 17 PHP
ThinkPHP实例化模型的四种方法概述
Aug 22 PHP
初识php MVC
Sep 10 PHP
smarty中js的调用方法示例
Oct 27 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
Jan 12 PHP
Yii框架用户登录session丢失问题解决方法
Jan 07 PHP
php使用str_replace替换多维数组的实现方法分析
Jun 15 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
PHP的substr_replace将指定两位置之间的字符替换为*号
2011/05/04 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
JavaScript 七大技巧(一)
2015/12/13 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
基于elementUI实现图片预览组件的示例代码
2019/03/31 Javascript
vue实现密码显示与隐藏按钮的自定义组件功能
2019/04/23 Javascript
python里将list中元素依次向前移动一位
2014/09/12 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
采购部主管岗位职责
2014/01/01 职场文书
厂区绿化方案
2014/05/08 职场文书
白血病募捐倡议书
2014/05/14 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
Python基础之元编程知识总结
2021/05/23 Python
Python实现列表拼接和去重的三种方式
2021/07/02 Python
Redis 常见使用场景
2021/08/30 Redis
如何解决php-fpm启动不了问题
2021/11/17 PHP
Python开发简易五子棋小游戏
2022/05/02 Python