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 相关文章推荐
Windows下利用Gvim写PHP产生中文乱码问题解决方法
Apr 20 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
浅析PHP的ASCII码转换类
Jul 05 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
php中switch语句用法详解
Aug 17 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
Dec 23 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
Jun 28 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
PHP使用Redis实现Session共享的实现示例
May 12 PHP
PHP强制转化的形式整理
May 22 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动态生成JavaScript代码
2009/03/09 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
php合并js请求的例子
2013/11/01 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
php jsonp单引号转义
2014/11/23 PHP
彻底删除thinkphp3.1案例blog标签的方法
2014/12/05 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
js实现下一页页码效果
2017/03/07 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
Python箱型图处理离群点的例子
2019/12/09 Python
Python解析多帧dicom数据详解
2020/01/13 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
一文读懂Python 枚举
2020/08/25 Python
python SOCKET编程基础入门
2021/02/27 Python
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
综合办公室主任职责
2013/12/16 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
军训口号
2014/06/13 职场文书
文明好少年事迹材料
2014/08/19 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL