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 08 PHP
菜鸟学PHP之Smarty入门
Jan 04 PHP
php下使用curl模拟用户登陆的代码
Sep 10 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
浅析php中json_encode()和json_decode()
May 25 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
PHP常用处理静态操作类
Apr 03 PHP
php实现将Session写入数据库
Jul 26 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
Jun 07 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
Jun 22 PHP
tp5递归 无限级分类详解
Oct 18 PHP
php数组指针函数功能及用法示例
Feb 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 IDE phpstorm 常用快捷键
2015/05/18 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
JS加ASP二级域名转向的代码
2007/05/17 Javascript
用js模拟JQuery的show与hide动画函数代码
2010/09/20 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
[27:39]Ti4 循环赛第二日 LGD vs Fnatic
2014/07/11 DOTA
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Python xlwt模块使用代码实例
2020/06/10 Python
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
2013年大学生的自我鉴定
2013/10/24 职场文书
语文教育专业推荐信范文
2013/11/25 职场文书
经典演讲稿开场白
2014/08/25 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
会计岗位工作总结
2015/08/12 职场文书
话题作文之诚信
2019/11/28 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书