php设计模式之单例模式实例分析


Posted in PHP onFebruary 25, 2015

本文实例讲述了php设计模式之单例模式。分享给大家供大家参考。具体分析如下:

单例模式(职责模式):

简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;

单例类:

1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2、拥有一个保存类的实例的静态成员变量
3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)

另外,需要创建__clone()方法防止对象被复制(克隆)

为什么要使用PHP单例模式?

1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

代码实现:

<?php
/1**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。 
* 使用单例模式生成一个对象后,
* 该对象可以被其它众多对象所使用。 
*/
class Danli {
//保存类实例的静态成员变量
private static $_instance;
//private标记的构造方法
private function __construct(){
echo 'This is a Constructed method;';
}
//创建__clone方法防止对象被复制克隆
public function __clone(){
trigger_error('Clone is not allow!',E_USER_ERROR);
}
//单例方法,用于访问实例的公共的静态方法
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self;
}
return self::$_instance;
}
public function test(){
echo '调用方法成功';
}
}
//用new实例化private标记构造函数的类会报错
//$danli = new Danli();
//正确方法,用双冒号::操作符访问静态方法获取实例
$danli = Danli::getInstance();
$danli->test();
//复制(克隆)对象将导致一个E_USER_ERROR
$danli_clone = clone $danli;

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php $_ENV为空的原因分析
Jun 01 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
PHP 伪静态技术原理以及突破原理实现介绍
Jul 12 PHP
php网站地图生成类示例
Jan 13 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
php中使用gd库实现下载网页中所有图片
May 12 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PDO::errorCode讲解
Jan 28 PHP
PHP实现一维数组转二维数组的方法
Feb 25 #PHP
PHP中字符安全过滤函数使用小结
Feb 25 #PHP
PHP 魔术变量和魔术函数详解
Feb 25 #PHP
PDO防注入原理分析以及注意事项
Feb 25 #PHP
php短址转换实现方法
Feb 25 #PHP
php中mysql连接方式PDO使用详解
Feb 25 #PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 #PHP
You might like
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
JQuery教学之性能优化
2014/05/14 Javascript
jQuery实现鼠标点击弹出渐变层的方法
2015/07/09 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
AngularJs 弹出模态框(model)
2016/04/07 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
JavaScript 对象详细整理总结
2016/09/29 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
vue中实现高德定位功能
2019/12/03 Javascript
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
python字符串下标与切片及使用方法
2020/02/13 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
印度尼西亚综合购物网站:Lazada印尼
2016/09/07 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
机电工程学生自荐信范文
2013/12/07 职场文书
中层干部竞聘演讲稿
2014/05/15 职场文书
法院授权委托书格式
2014/09/28 职场文书
化验室安全管理制度
2015/08/06 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫