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 一元分词算法
Nov 30 PHP
php上的memcache和memcached两个pecl库
Mar 29 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
ThinkPHP结合ajax、Mysql实现的客户端通信功能代码示例
Jun 23 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
ThinkPHP路由机制简介
Mar 23 PHP
Zend Framework入门教程之Zend_Session会话操作详解
Dec 08 PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 PHP
PHP微信模板消息操作示例
Jun 29 PHP
php学习笔记之mb_strstr的基本使用
Feb 03 PHP
tp5.1 框架查询表达式用法详解
May 25 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数组
2006/10/09 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
python合并文本文件示例
2014/02/07 Python
如何将python中的List转化成dictionary
2016/08/15 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
2019/12/10 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Python Handler处理器和自定义Opener原理详解
2020/03/05 Python
python中的错误如何查看
2020/07/08 Python
基于Python实现天天酷跑功能
2021/01/06 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
Python实现简单猜数字游戏
2021/02/03 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
英国知名美妆护肤在线商城:Zest Beauty
2018/04/24 全球购物
数据库的约束含义
2012/09/09 面试题
协议书与合同的区别
2014/04/18 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
写给父母的感谢信
2015/01/22 职场文书
个人工作年终总结
2015/03/09 职场文书
新学期开学标语2015
2015/07/16 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
关于MySQL中的 like操作符详情
2021/11/17 MySQL