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将向Java靠拢
Oct 09 PHP
在PHP的图形函数中显示汉字
Oct 09 PHP
php 生成饼图 三维饼图
Sep 28 PHP
修改PHP的memory_limit限制的方法分享
Feb 21 PHP
CodeIgniter实现更改view文件夹路径的方法
Jul 04 PHP
PHP实现股票趋势图和柱形图
Feb 07 PHP
Yii中srbac权限扩展模块工作原理与用法分析
Jul 14 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
php进程daemon化的正确实现方法
Sep 06 PHP
PHP实现时间日期友好显示实现代码
Sep 08 PHP
PHP正则表达式之RCEService回溯
Apr 11 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
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
php学习之function的用法
2012/07/14 PHP
PHP获取http请求的头信息实现步骤
2012/12/16 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
详细讲解JS节点知识
2010/01/31 Javascript
jQuery数组处理方法汇总
2011/06/20 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
深入分析js的冒泡事件
2014/12/05 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
JavaScript实现选项卡效果的分析及步骤
2019/04/16 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
插入排序_Python与PHP的实现版(推荐)
2017/05/11 Python
python分析作业提交情况
2017/11/22 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
Python实现string字符串连接的方法总结【8种方式】
2018/07/06 Python
Python使用Slider组件实现调整曲线参数功能示例
2019/09/06 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
CSS3使用border-radius属性制作圆角
2014/12/22 HTML / CSS
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
德国帽子专家:Hutshopping
2019/11/03 全球购物
C语言编程题
2015/03/09 面试题
个人能力自我鉴赏
2014/01/25 职场文书
料理师求职信
2014/01/30 职场文书
预备党员的自我评价
2014/03/12 职场文书
2016高考寄语集锦
2015/12/04 职场文书