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 xfocus防注入资料
Apr 27 PHP
PHP基础学习小结
Apr 17 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
PHP多线程编程之管道通信实例分析
Mar 07 PHP
php保存任意网络图片到服务器的方法
Apr 14 PHP
php将图片文件转换成二进制输出的方法
Jun 10 PHP
为你总结一些php系统类函数
Oct 21 PHP
浅谈PHP安全防护之Web攻击
Jan 03 PHP
Smarty3配置及入门语法
Feb 22 PHP
PHPstorm快捷键(分享)
Jul 17 PHP
使用laravel和ECharts实现折线图效果的例子
Oct 09 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
xajax写的留言本
2006/11/25 PHP
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
php中Smarty模板初体验
2011/08/08 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
JS中剪贴板兼容性、判断复制成功或失败
2021/03/09 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
2015/11/01 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
vue-router路由懒加载的实现(解决vue项目首次加载慢)
2018/08/28 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Python爬取网易云音乐热门评论
2017/03/31 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
cmd运行python文件时对结果进行保存的方法
2018/05/16 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
2020/02/14 Python
Python3自定义json逐层解析器代码
2020/05/11 Python
总结python 三种常见的内存泄漏场景
2020/11/20 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
《圆明园的毁灭》教学反思
2014/02/28 职场文书
道路交通安全实施方案
2014/03/12 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
2019班干部竞选演讲稿范本!
2019/07/08 职场文书