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在线生成ico文件的代码
Oct 09 PHP
PHP开发框架总结收藏
Apr 24 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
PHP封装的HttpClient类用法实例
Jun 17 PHP
PHP比较运算符的详细介绍
Sep 29 PHP
使用PHP实现微信摇一摇周边红包
Jan 04 PHP
PHP的PDO操作简单示例
Mar 30 PHP
[原创]php简单隔行变色功能实现代码
Jul 09 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
Jun 01 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
Aug 03 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
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
PHP初学者头疼问题总结
2006/07/08 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
JavaScript中操作字符串小结
2015/05/04 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
任意Json转成无序列表的方法示例
2016/12/09 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
Vue 解决父组件跳转子路由后当前导航active样式消失问题
2020/07/21 Javascript
多个Vue项目部署到服务器的步骤记录
2020/10/22 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
Pytoch之torchvision.transforms图像变换实例
2019/12/30 Python
django中related_name的用法说明
2020/05/20 Python
严选全球尖货,立足香港:Bonpont宝盆
2018/07/24 全球购物
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
高三自我鉴定
2013/10/23 职场文书
教师对学生的评语
2014/04/28 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
Python爬虫中urllib3与urllib的区别是什么
2021/07/21 Python