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函数utf8转gb2312编码
Dec 21 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
php的一个简单加密解密代码
Jan 14 PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 PHP
php实现的CSS更新类实例
Sep 22 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
Nov 25 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
详解WordPress中添加友情链接的方法
May 21 PHP
详解php中空字符串和0之间的关系
Oct 23 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 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
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
PHP数组及条件,循环语句学习
2012/11/11 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
jQuery 源码分析笔记(2) 变量列表
2011/05/28 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
angular 服务随记小结
2019/05/06 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
[48:31]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第二场 12.17
2020/12/19 DOTA
python开发之thread实现布朗运动的方法
2015/11/11 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
理想点亮人生演讲稿
2014/05/21 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
安全检查汇报材料
2014/12/26 职场文书
小平小道观后感
2015/06/09 职场文书
爱国主义影片观后感
2015/06/18 职场文书
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL