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开发者事半功倍的十大技巧小结
Apr 20 PHP
9个PHP开发常用功能函数小结
Jul 15 PHP
PHP排序算法的复习和总结
Feb 15 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
yii的CURD操作实例详解
Dec 04 PHP
php简单统计字符串单词数量的方法
Jun 19 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
Laravel框架模板继承操作示例
Jun 11 PHP
PHP 8新特性简介
Aug 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
javascript实现单击和双击并存的方法
2014/12/13 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
2016/08/23 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
three.js 入门案例详解
2018/01/23 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
MySQL最常见的操作语句小结
2015/05/07 Python
Python中条件判断语句的简单使用方法
2015/08/21 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
python脚本实现mp4中的音频提取并保存在原目录
2020/02/27 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
军训教官感言
2014/03/02 职场文书
十佳党员事迹材料
2014/08/28 职场文书
立志成才演讲稿
2014/09/04 职场文书