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 小乘法表实现代码
Jul 16 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
Oct 31 PHP
PHP 之Section与Cookie使用总结
Sep 14 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
php生成xml时添加CDATA标签的方法
Oct 17 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
Oct 23 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
php支付宝接口用法分析
Jan 04 PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 PHP
在Laravel 中实现是否关注的示例
Oct 22 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
解析在zend Farmework下如何创立一个FORM表单
2013/06/28 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
json跟xml的对比分析
2008/06/10 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
Bootstrap如何创建表单
2016/10/21 Javascript
js实现音频控制进度条功能
2017/04/01 Javascript
js使用generator函数同步执行ajax任务
2017/09/05 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
React如何避免重渲染
2018/04/10 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
2020/07/27 Javascript
vue+echarts+datav大屏数据展示及实现中国地图省市县下钻功能
2020/11/16 Javascript
Python实现统计英文单词个数及字符串分割代码
2015/05/28 Python
python交互式图形编程实例(一)
2017/11/17 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
英国女士家居服网站:hush
2017/08/09 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
领导干部考察材料
2014/02/08 职场文书
5s标语大全
2014/06/23 职场文书
小学爱国卫生月活动总结
2014/06/30 职场文书
教师节活动总结
2014/08/29 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
应届毕业生自荐信
2015/03/04 职场文书
教师听课学习心得体会
2016/01/15 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
升级 Win11 还是坚守 Win10?微软 Win11 新系统缺失功能大盘点
2022/04/05 数码科技