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缓存类代码(附详细说明)
Jun 09 PHP
PHP三元运算符的结合性介绍
Jan 10 PHP
PHP URL路由类实例
Nov 12 PHP
php中apc缓存使用示例
Dec 25 PHP
php中cookie的使用方法
Mar 29 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 PHP
php实现utf-8转unicode函数分享
Jan 06 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
php上传图片生成缩略图(GD库)
Jan 06 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
php中关于长度计算容易混淆的问题分析
May 27 PHP
php中通用的excel导出方法实例
Dec 30 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下实现伪 url 的超简单方法[转]
2007/09/24 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
php正则修正符用法实例详解
2016/12/29 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
javascript 程序库的比较(一)之DOM功能
2010/04/07 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
Vue表单实例代码
2016/09/05 Javascript
微信小程序 canvas API详解及实例代码
2016/10/08 Javascript
webpack入门必知必会
2017/01/16 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
详解Python中的文件操作
2021/01/14 Python
PyQt QMainWindow的使用示例
2021/03/24 Python
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
网络优化专员求职信
2014/05/04 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
归途列车观后感
2015/06/17 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
Python中Selenium对Cookie的操作方法
2021/07/09 Python
Nginx速查手册及常见问题
2022/04/07 Servers
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers