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 相关文章推荐
动易数据转成dedecms的php程序
Apr 07 PHP
php htmlentities和htmlspecialchars 的区别
Aug 18 PHP
php 验证码实例代码
Jun 01 PHP
php cookies中删除的一般赋值方法
May 07 PHP
PHP如何利用P3P实现跨域
Aug 24 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
php常用hash加密函数
Nov 22 PHP
Swoole-1.7.22 版本已发布,修复PHP7相关问题
Dec 31 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
Jul 09 PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 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中的比较运算符详解
2013/10/28 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
浅谈Fetch 数据交互方式
2018/12/20 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
Python实现CET查分的方法
2015/03/10 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
python实现数独算法实例
2015/06/09 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
浅谈python中get pass用法
2019/03/19 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
python实现斗地主分牌洗牌
2020/06/22 Python
Python局部变量与全局变量区别原理解析
2020/07/14 Python
英国家用电器购物网站:Hughes
2018/02/23 全球购物
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
公司管理建议书范文
2014/03/12 职场文书
《画杨桃》教学反思
2014/04/13 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
小学同学聚会感言
2015/07/30 职场文书
在Python中如何使用yield
2021/06/07 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技