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调用MySQL的存储过程的实现代码
Aug 12 PHP
关于session在PHP5的配置文件中的详细设置参数说明
Apr 20 PHP
php设计模式 Command(命令模式)
Jun 26 PHP
php 检查电子邮件函数(自写)
Jan 16 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
php上传图片生成缩略图(GD库)
Jan 06 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
php基于session锁防止阻塞请求的方法分析
Aug 07 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
TP5框架安全机制实例分析
Apr 05 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常用代码
2006/11/23 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
jQuery实现弹窗下底部页面禁止滑动效果
2017/12/19 jQuery
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
2020/08/04 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
win10系统中安装scrapy-1.1
2016/07/03 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Python基于滑动平均思想实现缺失数据填充的方法
2019/02/21 Python
Python中如何导入类示例详解
2019/04/17 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
Python猴子补丁知识点总结
2020/01/05 Python
django实现模型字段动态choice的操作
2020/04/01 Python
css3的@media属性实现页面响应式布局示例代码
2014/02/10 HTML / CSS
新加坡领先的在线生活方式和杂货购物网站:EAMART
2019/04/02 全球购物
入股协议书范本
2014/04/14 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
js不常见操作运算符总结
2021/11/20 Javascript