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 相关文章推荐
多文件上载系统完整版
Oct 09 PHP
用php实现像JSP,ASP里Application那样的全局变量
Jan 12 PHP
php cookie 登录验证示例代码
Mar 16 PHP
php读取文件内容的几种方法详解
Jun 26 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
Jan 12 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 PHP
php判断访问IP的方法
Jun 19 PHP
PHP的APC模块实现上传进度条
Oct 27 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 PHP
laravel清除视图缓存的代码
Oct 23 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
基于Zend的Config机制的应用分析
2013/05/02 PHP
php中adodbzip类实例
2014/12/08 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
PHP+sqlite数据库操作示例(创建/打开/插入/检索)
2016/05/26 PHP
JavaScript 事件记录使用说明
2009/10/20 Javascript
javascript innerText和innerHtml应用
2010/01/28 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
JS模拟的Map类实现方法
2016/06/17 Javascript
angular.js中解决跨域问题的三种方式
2017/07/12 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
[01:29]Ti4循环赛第三日精彩回顾
2014/07/13 DOTA
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
python生成随机图形验证码详解
2017/11/08 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
全球最大最受欢迎的旅游社区:Tripadvisor
2017/11/03 全球购物
得到Class的三个过程是什么
2012/08/10 面试题
你懂得怎么写自荐信吗?
2013/12/27 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
商务英语专业求职信
2014/06/26 职场文书
管理工程专业求职信
2014/08/10 职场文书
市场部岗位职责范本
2015/04/15 职场文书
收入证明怎么写
2015/06/12 职场文书
读《人生的智慧》有感:闲暇是人生的精华
2019/12/25 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
vue中data里面的数据相互使用方式
2022/06/05 Vue.js