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 相关文章推荐
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
php合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
PHP简洁函数小结
Aug 12 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
PHP二维数组排序的3种方法和自定义函数分享
Apr 09 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
实例介绍PHP的Reflection反射机制
Aug 05 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
php实现微信支付之退款功能
May 30 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
Apr 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
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
JavaScript中数组的合并以及排序实现示例
2015/10/24 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
Nodejs实现多房间简易聊天室功能
2017/06/20 NodeJs
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
详解微信小程序胶囊按钮返回|首页自定义导航栏功能
2019/06/14 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
通过python3实现投票功能代码实例
2019/09/26 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
css3的transform造成z-index无效解决方案
2014/12/04 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
运动服饰每月订阅盒:Ellie
2018/04/29 全球购物
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
Prototype是怎么扩展DOM的
2014/10/01 面试题
保研推荐信
2014/05/09 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
国际金融专业自荐信
2014/07/05 职场文书
学校政风行风整改方案
2014/10/25 职场文书
男方婚前保证书
2015/02/28 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
吃通javascript正则表达式
2021/04/21 Javascript
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python