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 discuz 主题表和回帖表的设计
Mar 13 PHP
PHP Memcached应用实现代码
Feb 08 PHP
PHP队列用法实例
Nov 05 PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 PHP
php中Ctype函数用法详解
Dec 09 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
CI框架数据库查询之join用法分析
May 18 PHP
Laravel下生成验证码的类
Nov 15 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 PHP
php文件上传原理与实现方法详解
Dec 20 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 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
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php使用高斯算法实现图片的模糊处理功能示例
2016/11/11 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
js技巧--转义符&quot;\&quot;的妙用
2007/01/09 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
javascript实现yield的方法
2013/11/06 Javascript
Javascript中的异步编程规范Promises/A详细介绍
2014/06/06 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
jQuery动态加载css文件实现方法
2016/06/15 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
python 字典中文key处理,读取,比较方法
2018/07/06 Python
python中单下划线_的常见用法总结
2018/07/10 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python 堆和优先队列的使用详解
2019/03/05 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
用HTML5实现手机摇一摇的功能的教程
2012/10/30 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
数字漫画:comiXology
2020/06/13 全球购物
金讯Java笔试题目
2013/06/18 面试题
董事长秘书职责
2014/01/31 职场文书
超市促销活动方案
2014/03/05 职场文书
《钢铁是怎样炼成的》高中读后感
2019/08/07 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
Go遍历struct,map,slice的实现
2021/06/13 Golang
python接口测试返回数据为字典取值方式
2022/02/12 Python