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 柱状图实现代码
Dec 04 PHP
ThinkPHP与PHPExcel冲突解决方法
Aug 08 PHP
解析php中的fopen()函数用打开文件模式说明
Jun 20 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
php分页示例分享
Apr 30 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
PHP中实现获取IP和地理位置类分享
Feb 10 PHP
PHP中header用法小结
May 23 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
Oct 26 PHP
PHP实现负载均衡下的session共用功能
Apr 17 PHP
PHP生成推广海报的方法分享
Apr 22 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
从MySQL数据库表中取出随机数据的代码
2007/09/05 PHP
php 随机生成10位字符代码
2009/03/26 PHP
表单项的name命名为submit、reset引起的问题
2007/12/22 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
jQuery实现炫丽的3d旋转星空效果
2018/07/04 jQuery
用Node提供静态文件服务的方法
2018/07/06 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
vue-router二级导航切换路由及高亮显示的实现方法
2019/07/10 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
js中forEach,for in,for of循环的用法示例小结
2020/03/14 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
html5-Canvas可以在web中绘制各种图形
2012/12/26 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
英国排名第一的餐具品牌:Denby Pottery
2019/11/01 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
周鸿祎:教你写创业计划书
2013/12/30 职场文书
会计工作心得体会
2014/01/13 职场文书
四个太阳教学反思
2014/02/01 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
Python文件的操作示例的详细讲解
2021/04/08 Python
pytorch实现线性回归以及多元回归
2021/04/11 Python
CPU不支持Windows11系统怎么办
2021/11/21 数码科技