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源代码
Oct 09 PHP
PHP数组循环操作详细介绍 附实例代码
Feb 03 PHP
php设计模式小结
Feb 15 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
php文件上传的例子及参数详解
Dec 12 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
详解PHP发送邮件知识点
May 06 PHP
php 输出缓冲 Output Control用法实例详解
Mar 03 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在项目中寻找代码的坏味道(综艺命名)
2012/07/19 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
详解如何用VUE写一个多用模态框组件模版
2018/09/27 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
Python操作列表的常用方法分享
2014/02/13 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
小学运动会表扬稿
2014/01/19 职场文书
爷爷追悼会答谢词
2014/01/24 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
中学语文教学反思
2016/02/16 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
vue的项目如何打包上线
2022/04/13 Vue.js
nginx之queue的具体使用
2022/06/28 Servers
Python pyecharts案例超市4年数据可视化分析
2022/08/14 Python
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript