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&amp;java(二)
Oct 09 PHP
php db类库进行数据库操作
Mar 19 PHP
php运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
Dec 07 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
PHP编写登录验证码功能 附调用方法
May 19 PHP
php获取一定范围内取N个不重复的随机数
May 28 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
Sep 22 PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 PHP
浅谈如何提高PHP代码质量之单元测试
May 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
javascript document.referrer 用法
2009/04/30 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
AngularJS的内置过滤器详解
2015/05/14 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
基于python3生成标签云代码解析
2020/02/18 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
QML用PathView实现轮播图
2020/06/03 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
大学毕业感言200字
2014/03/09 职场文书
房产买卖委托公证书
2014/04/04 职场文书
大学新学期计划书
2014/04/28 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
python_tkinter事件类型详情
2022/03/20 Python