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 相关文章推荐
mysql5的sql文件导入到mysql4的方法
Oct 19 PHP
php 数组的创建、调用和更新实现代码
Mar 09 PHP
php str_pad 函数用法简介
Jul 11 PHP
php查找任何页面上的所有链接的方法
Dec 03 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
Jun 12 PHP
PHP经典面试题集锦
Mar 19 PHP
PHP 9 大缓存技术总结
Sep 17 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
php 三元运算符实例详细介绍
Dec 15 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
详解thinkphp的Auth类认证
May 28 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
Joomla开启SEF的方法
2016/05/04 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
javascript计算用户打开网页的停留时间
2014/01/09 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
js实现多选项切换导航菜单的方法
2015/02/06 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
js实现扫雷源代码
2020/11/27 Javascript
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
python 迭代器和iter()函数详解及实例
2017/03/21 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
django 多数据库及分库实现方式
2020/04/01 Python
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
联想智利官方网站:Lenovo Chile
2020/06/03 全球购物
美国最大最全的亚洲购物网站:美国亚米网(Yamibuy)
2020/05/05 全球购物
如何开启linux的ssh服务
2015/02/14 面试题
MYSQL支持事务吗
2013/08/09 面试题
创伤外科专业推荐信范文
2013/11/19 职场文书
信息技术专业个人自我评价
2013/12/11 职场文书
西式婚礼证婚词
2014/01/12 职场文书
大学生工作求职信
2014/06/23 职场文书
教师师德考核自我评价
2014/09/13 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
指导老师鉴定意见
2015/06/05 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python