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 应用程序的安全 -- 不能违反的四条安全规则
Nov 26 PHP
PHP has encountered an Access Violation
Jan 15 PHP
PHP缩略图等比例无损压缩,可填充空白区域补充色
Jun 10 PHP
解析PHP 5.5 新特性
Jul 02 PHP
Yii中render和renderPartial的区别
Sep 03 PHP
php格式化时间戳显示友好的时间实现思路及代码
Oct 23 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
Jan 28 PHP
Yii2.0中使用js异步删除示例
Mar 10 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 PHP
为你的 Laravel 验证器加上多验证场景的实现
Apr 07 PHP
PHP日期和时间函数的使用示例详解
Aug 06 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
JavaScript 异步调用框架 (Part 6 - 实例 &amp; 模式)
2009/08/04 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
jQuery.deferred对象使用详解
2016/03/18 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
jquery实现图片切换代码
2016/10/13 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
Express + Node.js实现登录拦截器的实例代码
2017/07/01 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
Vue中ref和$refs的介绍以及使用方法示例
2021/01/11 Vue.js
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
wxPython事件驱动实例详解
2014/09/28 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
python删除不需要的python文件方法
2018/04/24 Python
Django rest framework jwt的使用方法详解
2019/08/08 Python
公务员培训心得体会
2013/12/28 职场文书
运动员口号
2014/06/09 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
六查六看心得体会
2014/10/14 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
护理心得体会范文
2016/01/22 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
Java获取e.printStackTrace()打印的信息方式
2021/08/07 Java/Android